2017 亚洲区(乌鲁木齐赛区)网络赛-E

规律找不出来
百度一波
解释转:

序号 半连续数 a b (为了好说明问题,下面所提到的a,b数不包括平方)
1 1 == 1^2*1^2
8 36 == 2^2*3^2
49 1225 == 5^2*7^2
288 41616 == 12^2*17^2
想必大家都能看懂,下一个数的a等于上一个数的a+b;
而b的值则要分a的奇偶,当a为奇数时,b=sqrt(a^2*2-1),当a为偶数时,b=sqrt(a^2*2+1);
到了最重要的环节,就是序号的问题,序号和后面的a也有关系,
如果a为偶数,序号=a^2*2;如果a为奇数,序号=a^2*2-1;
下面就到了我们打表的环节;


void dabiao()
{
    LL a,b;
    a=1,b=1;
    LL i=1;
    int cnt=1;
    printf("a[%d]=%lld;\n",cnt,i);
    while(i<1e16)
    {
        cnt++;
        LL aa=a;
        a=a+b;
        b=aa+a;
        if(cnt&1)
        {
            i=a*a;
            i=i*2-1;
            printf("a[%d]=%lld;\n",cnt,i);
        }
        else
        {
            i=a*a;
            i=i*2;
            printf("a[%d]=%lld;\n",cnt,i);
        }
    }

}

代码:

#include
using namespace std;
typedef long long ll;
int main()
{
    ll a[25];
    a[1]=1;
    a[2]=8;
    a[3]=49;
    a[4]=288;
    a[5]=1681;
    a[6]=9800;
    a[7]=57121;
    a[8]=332928;
    a[9]=1940449;
    a[10]=11309768;
    a[11]=65918161;
    a[12]=384199200;
    a[13]=2239277041;
    a[14]=13051463048;
    a[15]=76069501249;
    a[16]=443365544448;
    a[17]=2584123765441;
    a[18]=15061377048200;
    a[19]=87784138523761;
    a[20]=511643454094368;
    a[21]=2982076586042449;
    a[22]=17380816062160328;
    int T;
    scanf("%d",&T);
    for(int i=1; i<=T; i++)
    {
        ll N;
        scanf("%lld",&N);
        if(N>a[22])
            printf("Case #%d: -1\n",i);
        else
        {
            for(int j=1; j<23; j++)
            {
                if(a[j]>=N)
                {
                    printf("Case #%d: %lld\n",i,a[j]);
                    break;
                }

            }
        }
    }
}

你可能感兴趣的:(基础算法)