高精度+公式递推,有点类似于斐波那契数列。
当m = 1时,ans = 2^d;
当m > 1时,f[1] = 1,f[2] = 2....f[m] = m,f[m+1] = f[m] + f[1]......f[n] = f[n-1] + f[n-m];
#include <stdio.h>
#include <string.h>
void sum( char *s1, char *s2, char *data ) {
int arr[1000];
/*// if ( s1 < s2 )
// swap(s1, s2);*/
int i,j,k,l1,l2,c;
l1 = strlen(s1);
l2 = strlen(s2);
c = 0;
k=0;
for ( i=l1-1,j=l2-1;i>=0&&j>=0;i--,j-- ) {
arr[k]=(s1[i]-'0'+s2[j]-'0'+c)%10;
c=(s1[i]-'0'+s2[j]-'0'+c)/10;
k++;
}
if ( i==-1&&j==-1 ) {
arr[k]=c;
k++;
}
else if ( i==-1 ) {
while ( j!=-1 ) {
arr[k] = (s2[j]-'0'+c)%10;
c = (s2[j]-'0'+c)/10;
k++;
j--;
}
}
else if ( j==-1 ) {
while ( i!=-1 ) {
arr[k] = (s1[i]-'0'+c)%10;
c = (s1[i]-'0'+c)/10;
k++;
i--;
}
}
while ( arr[k-1]==0 )
k--;
i = 0;
for ( j=k-1;j>=0;j-- ) {
data[i] = arr[j]+'0';
i++;
}
data[i] = '\0';
}
/*
int main()
{
char s[50];
sum( "8", "8" ,s );
printf( "%s\n",s );
return 0;
}*/
int main()
{
char s[110][50];
int m,d,ctr;
char temp[50];
/* //s[0] = "1";
//s[1] = "2";*/
strcpy(s[0], "1");
strcpy(s[1], "2");
scanf( "%d%d", &m,&d );
while(m!=0 && d!=0) {
for ( ctr=2;ctr<=d;ctr++ ) {
if ( ctr-m<=0 )
strcpy(temp, "1");
else
strcpy( temp, s[ctr-m] );
sum( s[ctr-1], temp, s[ctr] );
}
/* printf( "%d\n", ctr );
printf( "%c\n", s[3][0] );*/
printf( "%s\n", s[ctr-1] );
scanf( "%d%d",&m,&d );
}
return 0;
}