Input
Output
Sample Input
7
Sample Output
6
当 i 为奇数时可以将 i-1 的展开项加 1 得到 i 的展开项
当 i 为偶数是单纯的将 i-1 的展开项加 1 无法得到所有的 i 的展开项,因为 i 是偶数,所以 i 的展开项中有全为偶数的情况
将全为偶数的展开像除以 2 得到的是 i/2 的展开项(可以倒着想,将 i/2 的展开项乘 2 得到 i 的全偶数展开项)
转移式为 dp[i] = (i&1)?(dp[i-1]):(dp[i-1]+dp[i/2])
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 1e6+5; 7 int dp[maxn]; 8 9 int main(){ 10 int n; 11 scanf("%d",&n); 12 memset(dp,0,sizeof(dp)); 13 dp[0] = 1; 14 15 for(int i=1;i<=n;++i){ 16 if(i&1) 17 dp[i] = dp[i-1]; 18 else{ 19 dp[i] = dp[i-1] + dp[i>>1]; 20 if(dp[i]>1000000000) 21 dp[i] -= 1000000000; 22 } 23 } 24 25 printf("%d\n",dp[n]); 26 return 0; 27 }
原文:https://www.cnblogs.com/kongbb/p/10095563.html