思路:找规律
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> int n,m; int main() { freopen("star.in","r",stdin); freopen("star.out","w",stdout); while(scanf("%d%d",&n,&m)&&n!=0&&m!=0) { if(!(n&1)||!(m&1)) printf("Yuri\n"); else printf("Chito\n"); } return 0; }
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; set<int>se; int n,k,ans; int val[50010],num[100000]; int cmp(int a,int b){ return a>b; } int main(){ freopen("war.in","r",stdin); freopen("war.out","w",stdout); scanf("%d%d",&n,&k); if(n<=100){ int tot=0; memset(num,0,sizeof(num)); for(int i=1;i<=n;i++) scanf("%d",&val[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) num[++tot]=val[i]^val[j]; sort(num+1,num+1+tot,cmp); for(int i=1;i<=k;i++) ans=(ans+num[i])%mod; cout<<ans; return 0; } if(k==1){ for(int i=1;i<=n;i++) scanf("%d",&val[i]); sort(val+1,val+1+n); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) ans=max(ans,val[i]^val[j]); cout<<ans; } else{ for(int i=1;i<=n;i++){ scanf("%d",&val[i]); se.insert(val[i]); } int num1[1000],num2[1000],sum,tot1=0,tot2=0,tot=0; for(int i=1023;i>=1;i--){ memset(num1,0,sizeof(num1)); if(tot==k) break; tot1=0; int xx=i; while(xx){ num1[++tot1]=xx%2; xx/=2; } for(int j=1;j<=n;j++){ memset(num2,0,sizeof(num2)); tot2=0,sum=0; int yy=j; while(yy){ num2[++tot2]=yy%2; yy/=2; } for(int q=1;q<=tot2;q++){ if(num1[q]==0&&num2[q]==1) sum+=pow(2,q-1); else if(num1[q]==1&&num2[q]==0) sum+=pow(2,q-1); } if(se.find(sum)!=se.end()){ ans=(ans+i)%mod; tot++; if(tot==k) break; } } } cout<<ans; } }