题目描述:给出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; }