思路:因为n只有1000,所以可以暴力一点,遍历每个数,然后记录和没个数的成绩,最后只需要输出有多少个k就可以了。应该可以用dp做
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 1070
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define INF 100000000
int n ,k;
map<int , int>m , ans;
map<int , int>::iterator it;
int a[maxn];
int main()
{
int t ;
scanf("%d" , &t);
while(t--)
{
m.clear();
ans.clear();
scanf("%d %d" , &n , &k);
int tmp;
for(int i = 0 ; i < n ; i ++)
{
scanf("%d" , &a[i]);
}
for(int i = 0 ; i < n ; i ++ )
{
if(k % a[i] == 0)
{
m = ans;
for(it = m.begin() ; it != m.end() ; it++ )
{
int tmp = a[i] * (it -> first);
if(k % tmp == 0)
{
ans[tmp] = (ans[tmp] + (it -> second)) % MOD;
}
}
ans[a[i]] = (ans[a[i]] + 1) % MOD;
}
}
printf("%d\n" , ans[k]);
}
return 0;
}