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;
}

  

posted @ 2018-04-16 18:19  蒟蒻JHY  阅读(238)  评论(0编辑  收藏  举报