牛客练习赛66 A-C
前三题挺简单的,后三题难度骤增。
A:白送的题
#include<stdio.h> int main() { long long add,s; scanf("%lld",&s); for(add=1;add<=1000000;add+=1) { if(add*add>s) break; } if(add*add-s>s-(add-1)*(add-1)) printf("%lld",(add-1)*(add-1)); else printf("%lld",add*add); }
B:因为是异或,所以路长要么是1要么是2,发现这一点就很简单
#include<stdio.h> int p[1000001],s[1048577]={0}; int main() { int m,n,add,k,x,y; scanf("%d %d",&m,&n); for(add=1;add<=m;add++) { scanf("%d",&p[add]); s[p[add]]++; } for(add=0;add<n;add++) { scanf("%d %d %d",&k,&x,&y); if((p[x]^k)==p[y]) printf("1\n"); else if(p[x]==p[y]) { if(s[p[x]^k]>0) printf("2\n"); else printf("-1\n"); } else printf("-1\n"); } return 0; }
C:略烦,首先求出每个数与第一个数的差,然后求所有差的最大公因数即可。用的是gcd(gcd(p0,p1),p2)这样的方法,注意一些特殊情况就好了。
#include<stdio.h> long long p[1000000],q[1000000],gcdnow; int main() { long long n,add,x,y,a,b,ans; long long gcd; scanf("%lld",&n); scanf("%lld",&p[0]); for(add=1;add<n;add++) { scanf("%lld",&p[add]); q[add]=p[add]-p[0]; if(q[add]<0) q[add]=-q[add]; //printf("[%lld]",q[add]); } gcdnow=q[1]; add=2; while(gcdnow==0) gcdnow=q[add++]; for(;add<n;add++) { if(gcdnow==1) break; if(gcdnow==q[add]||q[add]==0) continue; if(gcdnow>q[add]) { x=gcdnow; y=q[add]; } else { x=q[add]; y=gcdnow; } while(x%y!=0) { //printf("[%lld %lld]",x,y); a=x%y; b=y; if(a<b) { x=b; y=a; } else { x=a; y=b; } //printf("[%lld %lld]",x,y); } if(gcdnow>y) gcdnow=y; //printf("{%lld}",gcdnow); } if(p[0]%gcdnow==0) ans=0; else if(p[0]>0) ans=gcdnow-p[0]%gcdnow; else { p[0]=-p[0]; ans=p[0]%gcdnow; } printf("%lld %lld",gcdnow,ans); }
好水的比赛 前三题特别简单 后三题感觉又特别难的样子