题目描述
前几个月放映的头号玩家简直火得不能再火了,作为一个探索终极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
备注:
为了防止溢出,可将输出对10^9 + 3取模
如果台阶数为4,每一步可以爬1,2,4,个台阶,则dp[4]=dp[3]+dp[2]+dp[0]
同理有dp[n]=dp[n-1]+dp[n-2]+dp[n-4]+......
一、递归的方法(但是本题递归在提交时会超时,因此需采用第二种非递归的方法):
#include<stdio.h>
#include<math.h>
int Mod=1000000003;
int Fun(int n)
{
int i=0,sum=0,t,x;
if(n==1)
{
return 1;
}
if(n==0)
{
return 1;
}
if (n ==2)
{
return 2;
}
while(1)
{
t=pow(2,i);
if(n-t<0)
{
break;
}
sum+=Fun(n-t);
sum%=1000000003;
i++;
}
return sum;
}
int main()
{
int n,t,i,N;
scanf("%d",&N);
int a[N];
for(i=0;i<N;i++)
{
scanf("%d",&n);
a[i]=Fun(n);
}
for(i=0;i<N;i++)
{
printf("%d\n",a[i]);
}
}
二、非递归
#include<stdio.h>
#include<math.h>
int Mod=1000000003;
int main()
{
int n,t,i;
int dp[1000],j;
dp[0]=1;
dp[1]=1;
for(i=2;i<=1000;i++)
{
dp[i]=0;
for(j=1;j<=i;j*=2)
{
dp[i]+=dp[i-j];
dp[i]%=Mod;
}
}
int N;
scanf("%d",&N);
int a[N];
for(i=0;i<N;i++)
{
scanf("%d",&n);
a[i]=dp[n];
}
for(i=0;i<N;i++)
{
printf("%d\n",a[i]);
}
}