基准时间限制:1 秒 空间限制:131072 KB
任何正整数都能分解成2的幂,给定整数N,求N的此类划分方法的数量!由于方案数量较大,输出Mod 1000000007的结果。
比如N = 7时,共有6种划分方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
比如N = 7时,共有6种划分方法。
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
Input
输入一个数N(1 <= N <= 10^6)
Output
输出划分方法的数量Mod 1000000007
Input示例
7
Output示例
6
f(2m+1) = f(2m) 因为奇数整数2m+1的每种分解方式中都必然含有至少一个1,当把每种分解方式都去掉1时,就得到2m的分解方式
f(2m) = f(2m-1) + f(m) 偶数整数2m的分解方式中可能有1,也可能没有1。如果有1,那一定会有偶数个1。现在把有1和无1分成两部分。先看有1的那部分,当把这部分里每个分解方式都去掉1,就得到2m-1的分解方式
然后再看无1的那部分,因为没有1,所以所有的分解方式都全是2的倍数,当把这部分里每种分解方式都除以2时,这就相当于全是m的分解方式(转自http://blog.csdn.net/ojshilu/article/details/16344121)
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<queue> 7 #include<set> 8 #include<vector> 9 #include<map> 10 using namespace std; 11 typedef long long LL; 12 LL N[1000006]; 13 const LL mod = 1e9+7; 14 int main(void) 15 { 16 N[1] = 1;int i,j; 17 for(i = 2;i <= 1000000;i++) 18 { 19 if(i%2==0) 20 { 21 N[i] = N[i-1]+N[i/2]; 22 N[i]%=mod; 23 } 24 else 25 { 26 N[i] = N[i-1]; 27 } 28 } 29 int n; 30 scanf("%d",&n); 31 printf("%lld ",N[n]); 32 return 0; 33 }