本来想打个lct的。。。发现太浪了时间不够用了。
于是打算随手水一发。
结果发现自己这种傻逼题都不会写了。。。。。。。。满满的滚粗既视感QAQ。。
考虑第k个斐波那契数的方案f[k],显然它可以由自己构成;如果选第k-1个斐波那契数,那么显然方案就是f[k-2];否则只有一种方案。
然后dp令f[k][0]表示不选第k个斐波那契数的方案,f[k][1]表示选,弄出n可以由哪些表示就好了。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 105
using namespace std;
ll n,f[N],dp[N][2]; int q[N];
int main(){
scanf("%lld",&n); int i;
f[1]=1; f[2]=2;
for (i=3; f[i-1]+f[i-2]<=n; i++) f[i]=f[i-1]+f[i-2];
int tp=0;
for (i--; i && n; i--) if (n>=f[i]){ q[++tp]=i; n-=f[i]; }
dp[tp][1]=1; dp[tp][0]=(q[tp]-1)>>1;
for (i=tp-1; i; i--){
dp[i][1]=dp[i+1][0]+dp[i+1][1];
dp[i][0]=dp[i+1][0]*((q[i]-q[i+1])>>1)+dp[i+1][1]*((q[i]-q[i+1]-1)>>1);
}
printf("%lld\n",dp[1][0]+dp[1][1]);
return 0;
}
by lych
2016.5.4