暴力DP水过,不是k的因子的部分剪枝。
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
const int MAXN=1010;
long long a[MAXN];
map<long long,long long> mp;
map<long long,long long> ::iterator it;
int main()
{
long long T,i,n,k,tmp;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
mp.clear();
mp[a[0]]++;
for(i=1;i<n;i++)
{
if(k%a[i])
continue;
it=mp.end();
it--;
for(;;it--)
{
tmp=(it->first)*a[i];
if(tmp<=k&&k%tmp==0)
mp[tmp]=(mp[tmp]+(it->second))%mod;
if(it==mp.begin())
break;
}
mp[a[i]]=(mp[a[i]]+1)%mod;
}
printf("%lld\n",mp[k]);
}
}