描述
一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。 用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
输入描述:
每组输入包括一个整数:N(1<=N<=1000000)。
输出描述:
对于每组数据,输出f(n)%1000000000。
示例1
输入:
7
输出:
6
代码如下:
import java.util.Scanner;
/*
* 整数拆分
*/
public class IntegerSplit {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
//dp[i]表示i被不同拆分的种数
int[] dp = new int[1000001];
dp[1] = 1;
for (int i = 2; i < dp.length; i++) {
if (i % 2 == 0) {
// 偶拆分,要么带1的形式,要么不带1的形式
// 带1的时候:dp[i] = dp[i-1]
// 不带1的时候:dp[i] = dp[i-1]
// 如: 8 = 4+4;2+2+4;2+2+2+2
// 4 = 2+2;1+1+2;1+1+1+1
dp[i] = (dp[i-1] + dp[i/2]) % 1000000000;
}else {
//奇拆分,必定可以拆出一个1,所以dp[i] = dp[i-1]
dp[i] = dp[i-1];
}
}
System.out.println(dp[n]);
}
}
}