前三题挺简单的,后三题难度骤增。
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);
}好水的比赛 前三题特别简单 后三题感觉又特别难的样子

京公网安备 11010502036488号