题目描述
一个整数总可以拆分为2的幂的和,例如:
7=1+2+47=1+2+2+27=1+1+1+47=1+1+1+2+27=1+1+1+1+1+27=1+1+1+1+1+1+1总共有六种不同的拆分方式。再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。用f(n)表示n的不同拆分的种数,例如f(7)=6.要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入描述:
每组输入包括一个整数:N(1<=N<=1000000)。
输出描述:
对于每组数据,输出f(n)%1000000000。
示例1
输入
7
输出
6
解题思路
设n的划分数是f(n),则有状态转移方程:
i是奇数:f[i]=f[i-1](把f[i]每一种划分中去掉一个1,就得到f[i-1])
i是偶数:f[i]=f[i-1]+f[i/2] 其中f[i-1]表示拆分有1的种数,f[i/2]表示拆分没有1的种数。
代码实现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f[1000001];
ll func(ll n){
for(ll i = 1; i <= n; i++){
if(i == 1)
f[i] = 1;
else if(i % 2)
f[i] = f[i-1];
else
f[i] = (f[i-1] + f[i/2]) % 1000000000;
}
return f[n];
}
int main(){
ll n;
while(cin >> n){
cout << func(n) << endl;
}
return 0;
}
继续加油吧!ヾ(◍°∇°◍)ノ゙(好困zzZZ)