Codeforces Round #439 (Div. 2)

Posted wolf940509

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #439 (Div. 2)相关的知识,希望对你有一定的参考价值。

A题

分析:注意异或以后可能会大于2e6,所以数组应该开到4e6。还有一种巧妙的解法就是用异或的性质,b^a^b=a,所以可以看出必然都是偶数对。

技术分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 #include "vector"
 7 using namespace std;
 8 const int maxn=5000;
 9 const int maxm=4e6+10;
10 int x[maxn],y[maxn];
11 int vis[maxm];
12 int n;
13 //vector<int> res;
14 int main()
15 {
16     scanf("%d",&n);
17     //res.push_back(0);
18     for(int i=1;i<=n;i++){
19         scanf("%d",&x[i]);
20         vis[x[i]]=1;
21         //res.push_back(x[i]);
22     }
23     for(int i=1;i<=n;i++){
24         scanf("%d",&y[i]);
25         vis[y[i]]=1;
26         //res.push_back(y[i]);
27     }
28     int cnt=0;
29     for(int i=1;i<=n;i++){
30         for(int j=1;j<=n;j++){
31             int num=x[i]^y[j];
32             if(vis[num]){
33                 cnt++;
34                 //cout<<res[i]<<" "<<res[j]<<endl;
35                 //cout<<num<<endl;
36             }
37         }
38     }
39     //cout<<(1^1)<<endl;
40     //cout<<cnt<<endl;
41     if(cnt%2==0)
42         cout<<"Karen"<<endl;
43     else
44         cout<<"Koyomi"<<endl;
45 }
View Code

B题

分析:要求最后一位数分为几种情况,如果两数之差超过10的,因为最后一位出现0,所以必然为0。如果两数相等,直接对10曲余,否则直接暴力即可。

技术分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "vector"
 6 using namespace std;
 7 long long a,b;
 8 int main()
 9 {
10     cin>>a>>b;
11     if(b-a>=10){
12         cout<<"0"<<endl;
13     }else{
14         long long t=b-a;
15         if(t==0)
16             cout<<"1"<<endl;
17         else if(t==1){
18             cout<<b%10<<endl;
19         }
20         else{
21             long long z=1;
22             vector<int>t;
23             for(long long i=a+1;i<=b;i++){
24                 int num=i%10;
25                 t.push_back(num);
26             }
27             for(int i=0;i<t.size();i++)
28                 z*=t[i];
29             z=z%10;
30             cout<<z<<endl;
31         }
32     }
33 }
View Code

C题

分析:题意比较难理解,就是给定三个集合,每个集合的元素个数分别为a,b,c。然后相同的一个集合当中任何两元素之间最短路必须大于等于3。求最多有多少种连线方式。根据题意我们就可以得知,首先同色的不可能相连,同时两个同色的不能连在一个其他颜色上。这个结论太重要了,这就说明了我们连任意两种颜色是独立的,于是最后结果就是(a,b),(a,c),(b,c)三者的乘积。而对于选取任意两种颜色,假设(a<b),那我们如果选取k条线段的话,必然有C(a,k)*C(b,k)*k!种组合方式,所以最终结果也就是k从0取到a的和,然后其余颜色也依次类推。

技术分享
 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "cmath"
 6 #include "algorithm"
 7 using namespace std;
 8 typedef long long LL;
 9 const LL mod= 998244353;
10 const int maxn=5050;
11 LL a[10];
12 LL f[maxn],dp[maxn][maxn];
13 void init(int n){
14     f[0]=1;
15     for(int i=1;i<=n;i++){
16         f[i]=f[i-1]*i;
17         f[i]%=mod;
18     }
19     for(int i=0;i<=n;i++){
20         dp[i][0]=1;
21     }
22     for(int i=1;i<=n;i++){
23         for(int j=1;j<=i;j++){
24             dp[i][j]=(dp[i-1][j-1]%mod+(dp[i-1][j]%mod))%mod;
25         }
26     }
27 }
28 int main()
29 {
30     cin>>a[1]>>a[2]>>a[3];
31     sort(a+1,a+4);
32     init(5000);
33     LL num1=0,num2=0,num3=0;
34     for(int i=0;i<=a[1];i++){
35         num1+=((dp[a[1]][i]%mod*(dp[a[2]][i]%mod))%mod*f[i])%mod;
36         num1%=mod;
37     }
38     for(int i=0;i<=a[2];i++){
39         num2+=((dp[a[2]][i]%mod*(dp[a[3]][i]%mod))%mod*f[i])%mod;
40         num2%=mod;
41     }
42     for(int i=0;i<=a[1];i++){
43         num3+=((dp[a[1]][i]%mod*(dp[a[3]][i]%mod))%mod*f[i])%mod;
44         num3%=mod;
45     }
46     LL ans=((num1*num2)%mod*num3)%mod;
47     cout<<ans<<endl;
48 }
View Code

 

以上是关于Codeforces Round #439 (Div. 2)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #439 (Div. 2) Problem B (Codeforces 869B)

Codeforces Round #439 (Div. 2) Problem A (Codeforces 869A) - 暴力

Codeforces Round #439 (Div. 2) Problem C (Codeforces 869C) - 组合数学

Codeforces Round #439 (Div. 2)

C - The Intriguing Obsession /* Codeforces Round #439 */ (dp )

Codeforces Round #439 (Div. 2) Problem E (Codeforces 869E) - 暴力 - 随机化 - 二维树状数组 - 差分