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.
简单递推
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> using namespace std; typedef long long LL; const int maxn = 1005; const LL base = 1e9 + 7; int T, n, m, x; LL f[maxn][maxn]; int main() { scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); memset(f, 0, sizeof(f)); f[0][0] = 1; for (int i = 1; i <= n; i++) { scanf("%d", &x); x = (x%m + m) % m; for (int j = 0; j < m; j++) { f[i][(j + x) % m] = (f[i - 1][j] + f[i - 1][(j + x) % m]) % base; } } printf("%I64d\n", f[n][0]); } return 0; }