Clarke and problem

Accepts: 130
Submissions: 781
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
克拉克是一名人格分裂患者。某一天,克拉克分裂成了一个学生,在做题。 
突然一道难题难到了克拉克,这道题是这样的:  
给你$n$个数,要求选一些数(可以不选),把它们加起来,使得和恰好是$p$的倍数($0$也是$p$的倍数),求方案数。  
对于$n$很小的时候,克拉克是能轻易找到的。然而对于$n$很大的时候,克拉克没有办法了,所以来求助于你。  
输入描述
第一行一个整数$T(1 \le T \le 10)$,表示数据的组数。  
每组数据第一行是两个正整数$n, p(1 \le n, p \le 1000)$。  
接下来的一行有$n$个整数$a_i(|a_i| \le 10^9)$,表示第$i$个数。
输出描述
对于每组数据,输出一个整数,表示问题的方案数,由于答案很大,所以求出对$10^9+7$的答案即可。  
输入样例
1
2 3
1 2
输出样例
2
Hint
有两种方案:什么也不选;全都选。