hdu 5464 Clarke and problem 动态规划
2015-10-03 19:02
399 查看
Clarke and problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 844 Accepted Submission(s): 340
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a student and read a book.
Suddenly, a difficult problem appears:
You are given a sequence of number a1,a2,...,an and
a number p.
Count the number of the way to choose some of number(choose none of them is also a solution) from the sequence that sum of the numbers is a multiple of p(0 is
also count as a multiple of p).
Since the answer is very large, you only need to output the answer modulo 109+7
Input
The first line contains one integer T(1≤T≤10) -
the number of test cases.
T test
cases follow.
The first line contains two positive integers n,p(1≤n,p≤1000)
The second line contains n integers a1,a2,...an(|ai|≤109).
Output
For each testcase print a integer, the answer.
Sample Input
1
2 3
1 2
Sample Output
2
Hint:
2 choice: choose none and choose all.
Source
BestCoder Round #56 (div.2)
定义dp[i][j]表示前i个数字构成的所有集合中,集合内所有数字相加之和对p取模为j的集合的个数。
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int dp[2][1001]; #define mod 1000000007 int main(){ int t,n,p; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&p); int w, u = 0, v = 1; memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(int i = 0;i < n; i++){ scanf("%d",&w); for(int j = 0;j < p; j++) dp[v][j] = dp[u][j]; w %= p; if(w < 0) w+=p; for(int j = 0;j < p ;j++){ dp[v][w] += dp[u][j]; if(dp[v][w] >= mod) dp[v][w] -= mod; w++; if(w >= p) w -= p; } swap(u,v); } printf("%d\n",dp[u][0]); } return 0; }