题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5464
题目大意:
给n个数,取部分数求和(可以一个都不选),看和能不能被p整除,计算出这样的方案数。
思路:
跟上次的那题很像,上次的一题是求和有没有被整除的。
具体链接在这里:
http://blog.csdn.net/aaaaacmer/article/details/48631075
这题明显不能暴力了,可以用dp,dp[i][j]代表在前i个数中求和取模得到j的方案数。
注意题目要求要取模mod
代码:
#include<stdio.h>
#include<string.h>
#define mod 1000000007
#define LL __int64
int dp[1005][1005];
int main()
{
int T,i,j,k,n,p;
int a[1005];
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
scanf("%d%d",&n,&p);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]=a[i]%p;
a[i]=(a[i]+p)%p;
}
dp[1][0]=1;
dp[1][a[1]]+=1;
for(i=2;i<=n;i++)
{
for(j=0;j<p;j++)
{
dp[i][j]+=dp[i-1][j];
dp[i][j]=dp[i][j]%mod;
dp[i][(j+a[i])%p]+=dp[i-1][j];
dp[i][(j+a[i])%p]=dp[i][(j+a[i])%p]%mod;
}
}
printf("%d\n",dp[n][0]%mod);
}
return 0;
}