Fibonacci
题目描述
小明非常喜欢Fibonacci数列,数列为 f1=1,f2=2,fn=fn−1+fn−2。 小明想知道对于一个整数n,使得n=fi+fj+fk的组合有多少种? 比如5=1+1+3 或者 5=1+2+2,有2种。注意 1+2+2 和 2+1+2 被认为是同一种。
输入
第一行是一个整数T(1≤T≤1000),表示样例的个数。
每个样例是一个整数n(3≤n≤109)。
输出
依次每行输出一个样例的结果,为一个整数。
样例输入
2 3 5
样例输出
1 2
#include<stdio.h>
int main()
{
int f[50];
int T,i,j,k,n,cnt;
scanf("%d",&T);
f[0]=1;
f[1]=1;
for(i=2;i<=45;i++)
{
f[i]=f[i-1]+f[i-2];
}
//printf("%d",f[45]);
while(T--)
{
cnt=0;
scanf("%d",&n);
for(i=1;i<=45;i++)//三个数不相等的情况
{
if(f[i]>n)
{
break;
}
for(j=i+1;j<=45;j++)
{
if(f[i]+f[j]>n)
{
break;
}
for(k=j+1;k<=45;k++)
{
if(f[i]+f[j]+f[k]>n)
{
break;
}
if(f[i]+f[j]+f[k]==n)
{
cnt++;
}
}
}
}
for(i=1;i<=45;i++)//后两个数相等的情况
{
if(f[i]>n)
{
break;
}
for(j=i+1;j<=45;j++)
{
if(f[i]+f[j]>n)
{
break;
}
if(f[i]+f[j]*2==n)
{
cnt++;
}
}
}
for(i=1;i<=45;i++)//前两个数相等的情况
{
if(f[i]>n)
{
break;
}
for(j=i+1;j<=45;j++)
{
if(f[i]*2>n)
{
break;
}
if(f[i]*2+f[j]==n)
{
cnt++;
}
}
}
for(i=1;i<=45;i++)//三个数相等的情况
{
if(f[i]>n)
{
break;
}
if(f[i]*3==n)
{
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}