思路:
对于一个数字 n,如果 n 是奇数,那么 n 的所有组合方式中一定包含一个 1,那么它和 n-1 的组合方式种数相同,f[n] = f[n-1];
如果 n 是偶数,那么它的组合方式中可能有 1,也可能没有 1,有 1 的组合方式有 f[n - 1] 种,没有 1 的组合方式有 f[n/2] 种,因为偶数组合方式除以 2 后的组合方式其实是一样的,f[n] = f[n-1] + f[n/2]
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define mod 1000000000
long f[1000005]; //储存每个数的拆分数量
int main(){
long n;
while(scanf("%ld",&n)!=EOF){
f[1]=1;
for(int i=2;i<=n;i++){
if(i%2==1){
f[i]=f[i-1];
}else{
f[i]=(f[i-1]+f[i/2])%mod;
}
}
cout<<f[n]<<endl;
}
return 0;
}