A題ios
分析:注意異或之後可能會大於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 }
B題ide
分析:要求最後一位數分爲幾種狀況,若是兩數之差超過10的,由於最後一位出現0,因此必然爲0。若是兩數相等,直接對10曲餘,不然直接暴力便可。spa
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 }
C題code
分析:題意比較難理解,就是給定三個集合,每一個集合的元素個數分別爲a,b,c。而後相同的一個集合當中任何兩元素之間最短路必須大於等於3。求最多有多少種連線方式。根據題意咱們就能夠得知,首先同色的不可能相連,同時兩個同色的不能連在一個其餘顏色上。這個結論過重要了,這就說明了咱們連任意兩種顏色是獨立的,因而最後結果就是(a,b),(a,c),(b,c)三者的乘積。而對於選取任意兩種顏色,假設(a<b),那咱們若是選取k條線段的話,必然有C(a,k)*C(b,k)*k!種組合方式,因此最終結果也就是k從0取到a的和,而後其他顏色也依次類推。blog
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 }
E題ci
分析:圍牆之間不相交,因此咱們能夠把每一個圍牆內部都設置成一個值,詢問的時候只要看兩個點的值是否相同便可。那麼怎麼get
將一個圍牆內設爲一個值呢,咱們能夠利用二維BIT,利用前綴和,進行區間更新,單點查詢,跟一維的時候區間更新單點更新一string
樣。那麼刪除的時候怎麼快速獲得這個圍牆原來設置的是什麼值呢,咱們能夠用哈希,將四個座標哈希成一個值。it
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "string" 5 using namespace std; 6 typedef long long LL; 7 const int maxn=2500+10; 8 const LL val=2333; 9 LL c[maxn][maxn]; 10 int n,m,q; 11 int lowbit(int x){ 12 return x&(-x); 13 } 14 void add(int x,int y,LL k){ 15 for(int i=x;i<=n;i+=lowbit(i)) 16 for(int j=y;j<=m;j+=lowbit(j)) 17 c[i][j]+=k; 18 } 19 void update(int x1,int y1,int x2,int y2,LL k){ 20 add(x2+1,y2+1,k); 21 add(x2+1,y1,-k); 22 add(x1,y2+1,-k); 23 add(x1,y1,k); 24 } 25 LL sum(int x,int y){ 26 LL ans=0; 27 for(int i=x;i;i-=lowbit(i)) 28 for(int j=y;j;j-=lowbit(j)) 29 ans+=c[i][j]; 30 return ans; 31 } 32 int main() 33 { 34 scanf("%d%d%d",&n,&m,&q); 35 for(int cas=1;cas<=q;cas++){ 36 int num,x1,y1,x2,y2; 37 scanf("%d%d%d%d%d",&num,&x1,&y1,&x2,&y2); 38 LL ans=x1; 39 ans=ans*val+y1; 40 ans=ans*val+x2; 41 ans=ans*val+y2; 42 if(num==1) 43 update(x1,y1,x2,y2,ans); 44 else if(num==2) 45 update(x1,y1,x2,y2,-ans); 46 else{ 47 LL ans1=sum(x1,y1); 48 LL ans2=sum(x2,y2); 49 if(ans1==ans2) 50 cout<<"Yes"<<endl; 51 else 52 cout<<"No"<<endl; 53 } 54 } 55 }