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

}