思路
对于一个数字 n,如果 n 是奇数,那么 n 的所有组合方式中一定包含一个 1,那么它和 n-1 的组合方式种数相同,dp[n] = dp[n-1];
如果 n 是偶数,那么它的组合方式中可能有 1,也可能没有 1,有 1 的组合方式有 dp[n - 1] 种,没有 1 的组合方式有 dp[n/2] 种,因为偶数组合方式除以 2 后的组合方式其实是一样的,dp[n] = dp[n-1] + dp[n/2]
#include <iostream> using namespace std; #define mod 1000000000 int dp[1000001]; long f2n(long n){ dp[1] = 1; for (long i = 2; i <= n; i++){ if (i % 2) dp[i] = dp[i - 1]; else dp[i] = (dp[i - 1] + dp[i / 2]) % mod; } return dp[n]; } int main(){ int n; while (cin >> n) { cout << f2n(n) << endl; } return 0; }