题目描述:给出n个整数,询问使其中若干个数相乘为k的方案数。
是一个类似于背包的dp。
把等选数字里面不是K约数的去掉。然后找出K的约数,进行离散化
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5, P = 1e9 + 7;
int d,n,k,dp[N],a[N];
map<int, int> mp;
int main(){
cin>>d;
for(int o=1;o<=d;o++){
cin>>n>>k;
memset(dp,0,sizeof(dp));
dp[1]=1;
int m=0,x;
mp.clear();
for(int i=1;i*i<=k;i++){
if(k%i==0){
a[++m]=i;
if(i*i!=k)a[++m]=k/i;
}
}
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)mp[a[i]]=i;
for(int i=1;i<=n;i++){
cin>>x;
if(!mp.count(x))continue;
for(int i=m;i>=1;i--)
if(a[i]%x==0)dp[i]=(dp[i]+dp[mp[a[i]/x]])%P;
}
cout<<dp[m]<<endl;
}
return 0;
}
京公网安备 11010502036488号