[bzoj1677]求和
dp,用f[i]表示i划分的方案,直接枚举最后一个数是错误的,因为会导致c重复计数,然后正解十分神奇——
当i为奇数,那么分解中一定有1,因此f[i]=f[i-1]
当i为偶数若有1,同样转移到f[i-1];没有1,可以将所有因数除以2,即f[i]=f[i-1]+f[i/2],注意对1e9取模
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mod 1000000000 4 int n,f[1000005]; 5 int main(){ 6 scanf("%d",&n); 7 f[0]=1; 8 for(int i=1;i<=n;i++) 9 if (i&1)f[i]=f[i-1]; 10 else f[i]=(f[i-1]+f[i/2])%mod; 11 printf("%d",f[n]); 12 }