看到题目后直接就01背包,只考虑到排除乘积大于K的…直接在测试运行处就TLE了…
思考一番之后,毫无耐心地查看了官方解题报告。。至于离散化之类的麻烦自然是率先忽略了,只注意到“不是K的约数即可排除”,毕竟就加个判断。
1、n个数里只要不是K的约数即可排除
2、相乘过程中乘积若不是K的约数也可忽略
AC代码:
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
typedef map<ll,int> M;
M m;
int main()
{
int T,n,k,tmp;
cin>>T;
while(T--){
m.clear();
cin>>n>>k;
m[0]++;
while(n--){
scanf("%d",&tmp);
if(k%tmp)continue;
for(M::reverse_iterator it=m.rbegin();it!=m.rend();++it){
ll mu = tmp;
if(it->first>0)mu*=it->first;
if(mu<=k&&k%mu==0) m[mu]=(m[mu]+it->second)%MOD;
}
}
cout<<m[k]<<endl;
}
return 0;
}