[toc]

A A Simple Math Problem

B Apple

题意:

n个苹果,m个人,每个人至少一个苹果,且每个人苹果数量不同,问有没有可能?

题解:

签到题(我竟然还wa了一次,着急抢时间不可取)
我们假设m个人每个人苹果数量分别是为1...m
求和m*(1+m)/2
如果n大于则可能,否则不可能

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int n,m;
    while(t--)
    {
        cin>>n>>m;
        if(n>=(m*(1+m)/2)&&n>=m)
        {
            cout<<"possible"<<endl;
        }
        else cout<<"impossible"<<endl;
    }


} 

C Charging

D Chinese Valentine's Day

E Color Sequence

题意:

n个数,问有多少个合格序列?
合格序列定义:序列中每个数出现次数均为偶数

题解:

一开始用二进制+尺取做,超时了
后来发现答案更加其巧妙
二进制是为了方便记录每个数出现的情况,因为只有奇数和偶数,如果x出现一次,就记录第x位为1,也就是(1<<x),当x又一次出现时,异或一下,1^1就会成0
具体做法:
now表示每个数出现情况1~20,查看哪些数出现奇数次,记录下来,然后ans+=mark[temp]
代码最后两句什么意思?

ans+=mark[temp];
mark[now]++;

now表示是一种奇数情况,如果now为0说明都是偶数
我们用mark[now]++来记录每次的奇数情况,然后当now又出现一样的值时,也就是同一种情况出现两次,那奇数*2=偶数,我们就加上答案ans+=mark[now]
注:now[0]=1

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxm=1e6+5;
int mark[1<<22];
int a[maxm];
int n,m;
signed main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    int now=0;
    ll ans=0;
    mark[0]=1;
    for(int i=1;i<=n;i++){
        now^=(1<<a[i]);
        ans+=mark[now];
        mark[now]++;
    }
    cout<<ans<<endl;
    return 0;
}
/*
5
1 2 1 2 3
*/

F Magical Number

G Mathematical Practice

题意:

从一个大小为n的集合里,有顺序地取m次子集,求这些子集两两没有交集的方案数

题解:

说实话,式子我没推出来。。准确说是题没看懂
但是看样例
3 2->27
1000 25->605425003
3 2等于27,要么是3,要么是(2+1),我们可以用第二个样例来试验,发现对了。。。emmm
题解参考
图片说明

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod= 998244353;
ll poww(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1)ans=(ans*a)%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans%mod;
}
int main()
{
    ll x,y;
    cin>>x>>y;
    cout<<poww(y+1,x);
}

H Sequence

题解链接

I Simple Math Problem

题意:

给你一个5 * 5的矩阵,在掌握其规律后,问n * n的矩阵,第x行第y位答案是多少

题解:

u1s1,这个方阵我没看懂。。
我就感觉就是递增数的顺序,0~24,按照左下斜的顺序摆放

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    long long n,x,y;
    cin>>n>>x>>y;
    ll sum=0;
    ll w=x+y;
    if(w<n)
    {
        sum+=(w+1)*w/2;
        sum+=x;
    }
    else
    {
        sum+=(n+1)*n/2;
        sum+=(3*n-(w+1))*(w-n)/2;
        sum+=n-y-1;
    }
    cout<<sum;
}

J Split Game

K Travel Expense

L WZB's Harem

M Zoos's Animal Codes

题意:

两个字符串,请连接输出

题解:

题都没看,一看样例直接打代码

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
}