HDU4651+数学公式

时间:2023-11-26 21:29:08

见Goolgle

http://zh.wikipedia.org/zh-cn/%E6%95%B4%E6%95%B8%E5%88%86%E6%8B%86

 /*
数学公式
ans[i]:i可以有ans[i]种方法得到。(由1-i的数相加)
*/
#include<stdio.h>
typedef long long int64;
const int maxn = ;
const int64 mod = ;
int64 ans[ maxn+ ];
void init(){
int64 flag,k;
ans[ ] = ;
for( int64 i=;i<=maxn;i++ ){
flag = ;
k = ;
int64 Ans = ;
while( ){
int64 pos1 = (*k*k-k)/;
int64 pos2 = (*k*k+k)/;
if( pos1>i ) break;
Ans = (Ans+flag*ans[ i-pos1 ]+mod)%mod;
if( pos2>i ) break;
Ans = (Ans+flag*ans[ i-pos2 ]+mod)%mod;
flag = -flag;
k++;
}
ans[ i ] = Ans;
}
}
void test( ){
printf("%d\n",%);
printf("%d\n",-%);
printf("%d\n",-%);
}
int main(){
int T;
//test();
scanf("%d",&T);
init();
while( T-- ){
int n;
scanf("%d",&n);
printf("%lld\n",ans[ n ]);
}
return ;
}