HDU 5464 Clarke and problem

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(1T10)  - the number of test cases. 
T  test cases follow. 
The first line contains two positive integers  n,p(1n,p1000)  
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;
}


你可能感兴趣的:(HDU)