Clarke and problem
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 123 Accepted Submission(s): 64
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
一看到这题就想到用dp,只是一直没想到转移方程。
后面想到了一个但超时了。好久都没刷dp题了,好多都放了,本来就渣还忘了,哎!!
dp[i][j]表示前i个mod是j的方案数
转移方程
d
(
0
,
0
)
=
1
,
d
(
i
,
j
)
=
d
(
i
−
1
,
j
)
+
∑j=0p−1
d
(
i
−
1
,
(
j
−
a
[
i
]
)
m
o
d
p
)
#include
#include
#include
#include
using namespace std;
const int N = 1001;
int a[N];
long long dp[N][N];///dp[i][j]表示前i个mod是j的方案数
const int M = 1000000007;
int main(void)
{
int T;
scanf("%d", &T);
while(T--)
{
int n, p;
int i, j;
memset(dp, 0, sizeof(dp));
scanf("%d%d", &n, &p);
dp[0][0] = 1;
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
a[i] %= p;
if(a[i] < 0) a[i] += p;
}
for(i = 1; i <= n; i++)
{
for(j = 0; j < p; j++)
{
if(dp[i-1][j])
dp[i][ (j+a[i])%p ] = (dp[i][ (j+a[i])%p ] + dp[i-1][j])%M;
dp[i][j] = (dp[i][j] + dp[i-1][j])%M;
}
}
printf("%lld\n", dp[n][0]);
}
return 0;
}