规律找不出来
百度一波
解释转:
序号 半连续数 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<bits/stdc++.h>
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;
}
}
}
}
}