一开始想的很复杂还列了一个2的幂次表,最后还是被困住了。
在Discuss里看到了一个巨巨的思路,不仅高效而且简明:
dp[i]为数字i的最多组合数。
将i分奇偶考虑:
如果i是奇数,i的任意一个组合都包含1,即dp[i-1]的每一种组合后+1,因此dp[i] = dp[i-1]。
如果i是偶数,i的组合数为i-1的组合数(每种组合后+1)以及i / 2的组合数(每种组合*2)之和。
#include <cstdio>
const int MAXN = 1e6;
const int MOD = 1e9;
int dp[MAXN+1];
int main()
{
int n;
scanf("%d", &n);
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = (i & 1 ? dp[i-1] : dp[i-1] + dp[i >> 1]) % MOD;
}
printf("%d\n", dp[n]);
return 0;
}
666666!