标签:
题目链接:
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\n", dp[n&1][0]); 29 } 30 return 0; 31 }
Hdu 5464 Clarke and problem (dp)
标签:
原文地址:http://www.cnblogs.com/alihenaixiao/p/4845896.html