#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define all(x) (x).begin(), (x).end() #define bit(x) (1 << (x)) #define cnt1(x) (__builtin_popcount(x)) #define LB lower_bound #define LET(it,v) __typeof(v) it(v) #define mset0(x) memset((x), 0, sizeof((x))) #define mset1(x) memset((x), -1, sizeof((x))) #define pb push_back #define PQ priority_queue #define REP(it,v) for(LET(it,v.begin());it!=v.end();it++) #define sqr(x) ((x)*(x)) #define sz(x) ((int)(x.size())) #define UB upper_bound #define X first #define Y second typedef long long LL; typedef double DB; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vpii; template inline void chkmin(T &a, T b) { if (b < a) a = b; } template inline void chkmax(T &a, T b) { if (a < b) a = b; } const int MX = 1005; const int MOD = 1000000007; void add(int &a, int b) { a += b; if (a >= MOD) a -= MOD; } int rlt[MX], trlt[MX]; int main() { int T, n, P; int i, j, x; for (scanf("%d", &T); T--; ) { scanf("%d%d", &n, &P); for (i = 0; i < P; i++) rlt[i] = 0; rlt[0] = 1; for (i = 1; i <= n; i++) { scanf("%d", &x); for (j = 0; j < P; j++) trlt[j] = rlt[j]; for (j = 0; j < P; j++) { add(rlt[((j + x) % P + P) % P], trlt[j]); } } printf("%d\n", rlt[0]); } return 0; }