题意:
**来张图片,仅仅证明我真的翻开过这个页面 **
开玩笑!!
思路:
这道题两种方法
(1)线性的找规律,递推
递推式:
i % 2 == 0 :f[ i ] = (f[i - 1] + f[i >> 1]) % mod;
i % 2 == 1 :f[ i ] = f[i - 1]
(2)DP(动态规划),递推
首先,f[ 1 ] = 1;
其次 ,当n为奇数时,必然有1,将所有的方式都去掉一个1,就是f[n - 1],此时f[n] = f[n - 1];
最后,当n为偶数时,可以有1,也可以没有1 。。。。
有1时:所有的方案都去掉一个1,那么就是f[n - 1]
没有1时:所有的分解方式都是2的倍数,那么将所有的方式都除以2,就是f[n / 2];
得到的就是:f[n] = f[n - 1] + f[n / 2]
代码实现:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e6 + 5;
const ll mod = 1e9 + 7;
int n;
ll f[maxn];
void init(){
f[0] = 1; f[1] = 1;
for(int i = 2;i <= 1e6;i++){
if(i % 2 == 0){
f[i] = (f[i - 1] + f[i >> 1]) % mod;
}
else f[i] = f[i - 1];
}
}
int main(){
init();
scanf("%d",&n);
printf("%lld\n",f[n]);
return 0;
}