前三题挺简单的,后三题难度骤增。
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);
}

好水的比赛 前三题特别简单 后三题感觉又特别难的样子