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;
}
原文地址:https://www.cnblogs.com/naruto-mzx/p/11853742.html