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
考虑到数据很大,可以先打表,把斐波那契数存在数组里。
斐波那契数列:第一、二项是1,往后每一项都等于 前两项之和。
为了避免重复,只需保证后一个数大于或等于前一个数即可。
#include <stdio.h>
int num[102000];//把Fabonacci算到小于10^9,最大的下标i是101869
void Fabonacci();
int main (){
int T;
int n;
int i,j,k;
Fabonacci();
scanf ("%d",&T);
while (T--){
int cnt=0;
scanf ("%d",&n);
for (i=1;num[i]<n;i++){
for (j=1;num[i]+num[j]<n;j++){
if (num[j]<num[i]) continue;//若后一位数小于前一位,跳过;别把这个写到for里,会漏解
for (k=1;num[i]+num[j]+num[k]<=n;k++){//同时保证三个数之和小于等于n
if (num[k]<num[j]) continue;//同理
if (num[i]+num[j]+num[k]==n) cnt++;//判断n满足条件
}
}
}
printf ("%d\n",cnt);
}
return 0;
}
void Fabonacci(){
int i;
num[0]=num[1]=1;
for (i=2;num[i]<=1000000000;i++){
num[i]=num[i-1]+num[i-2];
}
//printf ("%d\n",i);
}