Description
农夫顿因开始玩飞盘之后,约翰也打算让奶牛们享受飞盘的乐趣.他要组建一只奶牛飞盘
队.他的N(1≤N≤2000)只奶牛,每只部有一个飞盘水准指数Ri(1≤Ri≤100000).约翰要选出1只或多于1只奶牛来参加他的飞盘队.由于约翰的幸运数字是F(1≤F≤1000),他希望所有奶牛的飞盘水准指数之和是幸运数字的倍数.
帮约翰算算一共有多少种组队方式.
Input
第1行输入N和F,之后N行输入Ri.
Output
组队方式数模10^8取余的结果.
Sample Input
4 5
1
2
8
2
1
2
8
2
Sample Output
3
HINT
组队方式有(2,3),(3,4),(1,2,4)共三种
dp的时候只保留指数之和模F为某个余数的就可以啦……
#include<cstdio>
#include<algorithm>
using namespace std; int n,m,a,f[][],i,j;
char c;
int read(){
a=;
c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') a=a*+c-,c=getchar();
}
int main(){
scanf("%d%d",&n,&m);
f[][]=;
int l=,d=;
for (i=;i<n;i++){
read();
swap(l,d);
a%=m;
for (j=m-;j>=;j--) {f[j][d]=f[j][l]+f[j<a?j-a+m:j-a][l];if(f[j][d]>=1e8) f[j][d]-=1e8;}
}
printf("%d\n",f[][d]-);
}