题目大意:每头牛有一个能力值,在n头牛选若干头,求能力值和为F的倍数的方案数
题解:f[i][j]表示前i头牛能力值modF为j的方案数,只有两种决策
我的收获:状态中记录mod值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int M=2005;
const int P=1e8;
int n,F,a[M];
int f[M][M];
inline void add(int &x,int y){x+=y;if(x>P) x-=P;}
void work()
{
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=F;j++)
add(f[i][j],f[i-1][j]),add(f[i][(j+a[i])%F],f[i-1][j]);
cout<<f[n][0]-1<<endl;//扣掉f[0][0]的1
}
void init()
{
cin>>n>>F;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}
int main()
{
init();
work();
return 0;
}