51 NOD 1383 整数分解为2的幂
设f[i]为i这个数的划分方案,则:
1.i是奇数的时候,最前面只能放1,所以f[i] = f[i-1]
2.i是偶数的时候,最前面可以放1也可以不放1,而不放1的时候数列都是偶数所以 f[i] = f[i-1] + f[i>>1].
#include<bits/stdc++.h> #define ll long long using namespace std; const int ha=1000000007; const int maxn=1000005; int f[maxn],n; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;} inline void dp(){ f[0]=1; for(int i=1;i<=n;i++) if(i&1) f[i]=f[i-1]; else f[i]=add(f[i-1],f[i>>1]); } int main(){ scanf("%d",&n); dp(); printf("%d\n",f[n]); return 0; }
我爱学习,学习使我快乐