您的位置:首页 > 其它

HDU4651+数学公式

2013-08-15 20:26 302 查看
见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 = 100000;
const int64 mod = 1000000007;
int64 ans[ maxn+15 ];
void init(){
int64 flag,k;
ans[ 0 ] = 1;
for( int64 i=1;i<=maxn;i++ ){
flag = 1;
k = 1;
int64 Ans = 0;
while( 1 ){
int64 pos1 = (3*k*k-k)/2;
int64 pos2 = (3*k*k+k)/2;
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",13%20);
printf("%d\n",-13%20);
printf("%d\n",-13%5);
}
int main(){
int T;
//test();
scanf("%d",&T);
init();
while( T-- ){
int n;
scanf("%d",&n);
printf("%lld\n",ans[ n ]);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: