3400: [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 89 Solved: 60
[Submit][Status]
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)共三种
Source
题解:
和背包差不多,滚动一下。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<iostream> 7 #include<vector> 8 #include<map> 9 #include<set> 10 #include<queue> 11 #include<string> 12 #define inf 1000000000 13 #define maxn 1200 14 #define maxm 500+100 15 #define eps 1e-10 16 #define ll long long 17 #define pa pair<int,int> 18 #define for0(i,n) for(int i=0;i<=(n);i++) 19 #define for1(i,n) for(int i=1;i<=(n);i++) 20 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 21 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 22 #define mod 100000000 23 using namespace std; 24 inline int read() 25 { 26 int x=0,f=1;char ch=getchar(); 27 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 28 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 29 return x*f; 30 } 31 int n,m,t,f[maxn][maxn]; 32 int main() 33 { 34 freopen("input.txt","r",stdin); 35 freopen("output.txt","w",stdout); 36 n=read();m=read(); 37 f[0][0]=1; 38 for1(i,n) 39 { 40 int x=read()%m; 41 t=1-t; 42 for0(j,m-1)f[t][j]=(f[1-t][j]+f[1-t][(j-x+m)%m])%mod; 43 } 44 printf("%d ",f[t][0]-1); 45 return 0; 46 }