文章
6
粉丝
375
获赞
6
访问
50.2k
#include <bits/stdc++.h>
using namespace std;
int f[39]; //第39项Fibonacci数为102334155(>1e8)
map<int,int> cnt1, cnt2;
int main() {
f[0]=f[1]=1;
for(int i=2; i<40; ++i) f[i]=f[i-2]+f[i-1];
for(int s=0; s<1<<19; ++s) { //用s枚举前19项的所有可能状态
int sum=0;
for(int i=0; i<19; ++i) if(s>>i&1) { //s的第i位为1,表示选择第i+1项
sum+=f[i+1];
}
cnt1[sum]++;
}
for(int s=0; s<1<<19; ++s) { //用s枚举后19项的所有可能状态
int sum=0;
for(int i=0; i<19; ++i) if(s>>i&1) { //s的第i位为1,表示选择第i+20项
sum+=f[i+20];
}
cnt2[sum]++;
}
int n;
while(cin>>n){
int answer=0;
for(pair<int,int> p: cnt1) { //从小到大枚举cnt1的所有键对
if(p.first>n) break; //map是排好序的,这里都不行了,后面就更不行了
answer+=p.second*cnt2[n-p.first]; //n-p.first为互补的值
}
cout<<answer<<endl;
}
}
登录后发布评论
暂无评论,来抢沙发