又是一個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);
}