Hdu 5464 Clarke and problem (dp)

题目链接:

  BestCoder Round #56 (div.1) 1002  Clarke and problem

题目描述:

  给出n个数,从中挑出任意个数,挑出的数字的和求余p等于零,问有多少种挑选情况?

解题思路:

  dp[i][j]代表前i个数加起来余数为j的取数方案。注意一下ai有可能小于0,这个题目就基本可以秒A了。

  简单dp,不知道为什么第一眼看完题目马上想到HASH余数(思路都错),果然是dp太弱。这场BC还好错过没打,要不真是一场送分跌名的噩梦。

 1 #include <vector>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 const int maxn = 1010;
 8 const int mod = 1000000007;
 9 typedef long long LL;
10 LL dp[2][maxn];
11 
12 int main ()
13 {
14     LL T, n, p, num;
15     scanf ("%lld", &T);
16     while (T --)
17     {
18         scanf ("%lld %lld", &n, &p);
19         memset (dp, 0, sizeof(dp));
20         dp[0][0] = 1;
21         for (int i=0; i<n; i++)
22         {
23             scanf ("%lld", &num);
24             num = (num % p + p) % p;
25             for (int j=0; j<p; j++)
26                 dp[(i+1)&1][(j+num)%p] = (dp[i&1][(j+num)%p] + dp[i&1][j])%mod;
27         }
28         printf ("%lld
", dp[n&1][0]);
29     }
30     return 0;
31 }
本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/alihenaixiao/p/4845896.html