luogu P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team
题目背景
老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍。
每只奶牛的能力为整数,第i头奶牛的能力为R i 。飞盘队的队员数量不能少于 1、大于N。一
支队伍的总能力就是所有队员能力的总和。
约翰比较迷信,他的幸运数字是F,所以他要求队伍的总能力必须是F的倍数。请帮他
算一下,符合这个要求的队伍组合有多少?由于这个数字很大,只要输出答案除以10^8的余
数就可以了。
输入格式
第一行:两个用空格分开的整数:N和F,1 ≤ N ≤ 2000,1 ≤ F ≤ 1000
第二行到N + 1行:第i + 1行有一个整数R i ,表示第i头奶牛的能力,1 ≤ R i ≤ 10 5
输出格式
第一行:单个整数,表示方案数除以10^8的余数
4 5 1 2 8 2 3 (有两种方案都是8 + 2 = 10,只是选的奶牛)
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,M=4*N,mod=1e8;
int a[N],f[N][1005];
signed main(){
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]%=mod;
}
f[0][0]=1;
for(int i=1;i<=n;i++){
memset(f[i&1],0,sizeof(f[i&1]));
for(int j=0;j<m;j++)
f[i&1][j]=(f[i&1][j]+f[(i-1)&1][j]+f[(i-1)&1][((j-a[i])%m+m)%m])%mod;
}
cout<<f[n&1][0]-1<<endl;
}
不以物喜,不以己悲