Codeforces Round #439 (Div. 2)

A. The Artful Expedient

題目連接:http://codeforces.com/contest/869/problem/Aios

題目意思:給你兩個數列,各包含n個數,如今讓你從上下兩個數列中各取一個數a[i],b[j],若是a[i]^b[j]在這2×n個數裏面出現過,那麼就得到一分,問將任意的a[i],b[j]之間的亦或以後,若是分數是奇數則Koyomi勝利,不然Karen勝利。問最後到底誰勝了。c++

題目思路:很是無聊的題目,暴力均可以過,就是暴力枚舉a[i],b[j],把全部答案都算出來,而後再用一個斷定存在的數組,來斷定是否出現過,而後算出最後的分數,可是有一個坑點.a[i]^a[j]可能會爆2*10^6因此當答案超出這個值的時候能夠直接continue,或者你開4*10^6也是沒有問題的,比賽的時候我是這麼作的,可是實際上並不須要這麼作,由於假設存在a[i]^b[j]==x存在於這2*n個數之中,那麼x^a[i]=b[j](x與b[j]一組)或者x^b[j]=a[i](x與a[i]一組),因此存在一組就不定存在另外一組與之對應,因此一定存在偶數組,因此karen必勝。數組

貼出我暴力的代碼:session

 1 /* ***********************************************
 2 Author        :xiaowuga
 3 Created Time  :2017年10月06日 星期五 21時34分51秒
 4 File Name     :A.cpp
 5 ************************************************ */
 6 #include <bits/stdc++.h>
 7 typedef long long LL; 
 8 #define endl "\n" 
 9 #define inf 0x3f3f3f3f 
10 const long long N=1000000;
11 const long long mod=1e9+7;
12 using namespace std;
13 bool q[2*1000000+10]={false};
14 long long a[2000];
15 long long b[2000];
16 int main(){
17     ios::sync_with_stdio(false);cin.tie(0);
18     int n;
19     cin>>n;
20     for(int i=0;i<n;i++){
21         cin>>a[i];
22         q[a[i]]=true;
23     }
24     for(int i=0;i<n;i++){
25         cin>>b[i];
26         q[b[i]]=true;
27     }
28     int ans=0;
29     for(int i=0;i<n;i++){
30         for(int j=0;j<n;j++){
31             int tmp=a[i]^b[j];
32             if(tmp>2*1000000LL) continue;
33             if(q[tmp]) ans++;
34         }    
35     }
36     if(ans&1) cout<<"Koyomi"<<endl;
37     else cout<<"Karen"<<endl;
38     return 0;
39 }
View Code

B. The Eternal Immortality

題目連接:http://codeforces.com/contest/869/problem/Bide

題目意思:給出兩個數a,b其中a<=b,求b!/a!的最後一位是多少?ui

題目思路:暴力題,首先答案就是(a+1)*(a+2)*(a+3)*(a+4)…………*b,一種思路是暴力直接算,當末尾的的數變成0了之後直接就輸出0結束,若是尚未變成0,就循環到b了,直接輸出答案,另外一種也是暴力算,可是記錄一個是否已經含有2和5的這兩個質因子(由於一個數包含2和5兩個質因子,末尾一定是0)。spa

代碼:3d

 1 /* ***********************************************
 2 Author        :xiaowuga
 3 Created Time  :2017年10月06日 星期五 21時53分14秒
 4 File Name     :B.cpp
 5 ************************************************ */
 6 #include <bits/stdc++.h>
 7 typedef long long LL; 
 8 #define endl "\n" 
 9 #define inf 0x3f3f3f3f 
10 const long long N=1000000;
11 const long long mod=1e9+7;
12 using namespace std;
13 int main(){
14     ios::sync_with_stdio(false);cin.tie(0);
15     long long a,b;
16     long long sum=1;
17     int c2=0,c5=0;
18     cin>>a>>b;
19     for(long long i=a+1;i<=b;i++){
20         sum*=i%10;
21         sum%=10;
22         if(i%2LL==0) c2++;
23         if(i%5LL==0) c5++;
24         if(c2&&c5) break;
25     }
26     if(c2&&c5) cout<<0<<endl;
27     else cout<<sum<<endl;
28     return 0;
29 }
View Code

C. The Intriguing Obsession

題目連接:http://codeforces.com/contest/869/problem/Ccode

題目意思:如今給出紅色,藍色,紫色的點若干,而後如今要在他們之間建橋,相同顏色的點之間不能存在通路,就算存在通路,最小的距離也要大於等於3,問有多少種建橋的方案,答案數mod998244353。blog

題目思路:相同顏色的點之間不能存在通路,並且最短距離不能小於3,那麼咱們先考慮其中兩種顏色,好比紅色和藍色,那麼若是一個紅色和兩個藍色之間存在連線,那麼就不知足題目的條件,因此咱們能夠把題目轉換爲x個不一樣的小球裝入y個不一樣的箱子,每一個箱子最多放一個小球,能夠選擇不把小球放進箱子,因此公式就是Σ(k=0,min(x,y))C(x,k)*(y!/(y-k)!)或者Σ(k=0,min(x,y))C(y,k)*(x!/(x-k)!)也是能夠的,答案是同樣的,咱們設其爲F(x,y),那麼最後答案是就是若是三個小球的數量是x,y,z了話,那麼最後答案就是F(x,y)*F(x,z)*F(y,z)。

代碼:

 1 /* ***********************************************
 2 Author        :xiaowuga
 3 Created Time  :2017年10月07日 星期六 13時10分37秒
 4 File Name     :C.cpp
 5 ************************************************ */
 6 #include <bits/stdc++.h>
 7 typedef long long LL; 
 8 #define endl "\n" 
 9 #define inf 0x3f3f3f3f 
10 const long long N=1000000;
11 const long long mod=998244353;
12 using namespace std;
13 vector<LL>fac,finv;
14 void init_fav_finv(int n){
15     fac.resize(n); 
16     finv.resize(n);
17     fac[0]=1;
18     for(int i=1;i<n;i++) fac[i]=fac[i-1]*i%mod;
19     finv[1]=1;
20     for(int i=2;i<n;i++) finv[i]=finv[mod%i]*(mod-mod/i)%mod;
21     finv[0]=1;
22     for(int i=1;i<n;i++) finv[i]=finv[i-1]*finv[i]%mod;
23 }
24 LL Comb(LL n,LL m){
25     return fac[n]*finv[m]%mod*finv[n-m]%mod;
26 }
27 LL Perm(LL n,LL m){
28     return fac[n]*finv[m]%mod;
29 }
30 LL cal(LL x,LL y){
31     if(x<y) swap(x,y);
32     LL sum=0;
33     for(LL i=0;i<=y;i++){
34         LL tmp=Comb(y,i)*Perm(x,x-i)%mod;
35         sum=(sum+tmp)%mod;
36     }
37     return sum;
38 }
39 int main(){
40     ios::sync_with_stdio(false);cin.tie(0);
41     init_fav_finv(6000);        
42     LL a,b,c;
43     cin>>a>>b>>c;
44     cout<<cal(a,b)*cal(a,c)%mod*cal(b,c)%mod<<endl;
45     return 0;
46 }
View Code
相關文章
相關標籤/搜索