Clarke and problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1292 Accepted Submission(s): 532
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
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).
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
代码:
1 #include<stdio.h> 2 #include<string.h> 3 const int mod=1e9+7; 4 const int N=1000+10; 5 int a[N]; 6 int dp[N][N]; 7 int main(){ 8 int t,n,p; 9 while(~scanf("%d",&t)){ 10 while(t--){ 11 scanf("%d%d",&n,&p); 12 for(int i=1;i<=n;i++){ 13 scanf("%d",&a[i]); 14 a[i]=(a[i]%p+p)%p; 15 } 16 dp[0][0]=1; 17 for(int i=1;i<=n;i++){ 18 for(int j=0;j<=p-1;j++){ 19 dp[i][j]=(dp[i-1][j]+dp[i-1][(j-a[i]+p)%p])%mod; 20 } 21 } 22 printf("%d ",dp[n][0]%mod); 23 } 24 } 25 return 0; 26 }