hdu 4658

来源:互联网 发布:淘宝家装日记哪里去了 编辑:程序博客网 时间:2024/06/12 20:47
/* 题目意思:将一个数n拆分成多个正数相加其中拆分数不能是k及k的倍数 */#include<cstdio>#include<algorithm>#include<iostream>using namespace std;using namespace std;#define P 1000000007#define N 100010int a[N];int main(){a[0]=1;for(int n=1;n<N;n++){int S=0;for(int i=1,w=0;;i++){w+=2*i-1;if(w>n)break;if(i&1)S=(S+a[n-w])%P;else S=(S-a[n-w]+P)%P;w+=i;if(w>n)break;if(i&1)S=(S+a[n-w])%P;else S=(S-a[n-w]+P)%P;}a[n]=S;}int _;scanf("%d",&_);while(_--){int n,k;scanf("%d%d",&n,&k);int S=a[n];for(int i=1,w=0;;i++){w+=(2*i-1)*k;if(w>n)break;if(~i&1)S=(S+a[n-w])%P;else S=(S-a[n-w]+P)%P;w+=i*k;if(w>n)break;if(~i&1)S=(S+a[n-w])%P;else S=(S-a[n-w]+P)%P;}printf("%d\n",S);}return 0;}

原创粉丝点击