版权声明:本文为博主-姜兴琪原创文章,未经博主允许不得转载。
前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极AI的研究人员,月神自然去看了此神剧。
由于太过兴奋,晚上月神做了一个奇怪的梦,月神梦见自己掉入了一个被施放了魔法的深渊,月神想要爬上此深渊。
已知深渊有N层台阶构成(1 <= N <= 1000),并且每次月神仅可往上爬2的整数次幂个台阶(1、2、4、....),请你编程告诉月神,月神有多少种方法爬出深渊
输入描述:
输入共有M行,(1<=M<=1000)
第一行输入一个数M表示有多少组测试数据,
接着有M行,每一行都输入一个N表示深渊的台阶数
输出描述:
输出可能的爬出深渊的方式
示例1
4
1
2
3
4
1
2
3
6
解题思路:
第6个台阶可以从2,4,5一次性到达,把dp[2],dp[3],dp[4],dp[5]求和即可
第1000个台阶可以从488(1000-512),744(1000-256)...999一次性到达,把dp[488]+...+dp[999]求和即可
备注:
为了防止溢出,可将输出对10^9 + 3取模
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] sc = new int[n];
for(int i=0;i<n;i++){
sc[i]=in.nextInt();
}
int[] dp=new int[1001];
for(int i=1;i<1001;i++){
dp[i]=0;
}
dp[0]=1;
int[] byteArray={1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
for(int i=0;i<1000;i++){
for(int j=0;j<10 && i>= byteArray[j];j++){
dp[i]+=dp[i-byteArray[j]];
dp[i]%=(1000000000 + 3);
}
}
for(int i=0;i<n;i++){
System.out.println(dp[sc[i]]);
}
in.close();
}
}