又是一个dp。
倍数即余数为0。
状态f[i][j]表示前i个数里加和余数为j的方案数。
f[i][j]=(f[i][j]+f[i-1][j])%mod;
f[i][(j+x)%m]=(f[i][(j+x)%m]+f[i-1][j])%mod;
个人认为设状态比状态转移更不好想。状态最好设题目中出现的且范围不是很大的量。
#include<stdio.h>
#define mod 100000000
int n,m;
int f[2005][1005];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
x%=m;
f[i][x]=1;
for(int j=0;j<m;j++)
{
f[i][j]=(f[i][j]+f[i-1][j])%mod;
f[i][(j+x)%m]=(f[i][(j+x)%m]+f[i-1][j])%mod;
}
}
printf("%d",f[n][0]%mod);
}