前言
题意
给你 n n n个袋子,里面装有 l i l_i li个球,每个球都有 a i j a_{ij} aij的权值
让你从这 n n n个袋子中,都挑出一个球使得所有球的乘积为 x x x
思路
因为题目没给范围,但是保证了袋子球乘积 < = 1 e 5 <=1e5 <=1e5
又因为难度排行 C C C,没怎么想就直接 d f s + 剪 枝 dfs+剪枝 dfs+剪枝 了
d f s dfs dfs和枚举排列差不多,因为没有给 n n n范围的缘故直接使用 d f s dfs dfs
另外在 乘积已经大于了 x x x 的时候进行优化即可
Code
const int N = 1e5+10;
ll cnt;
ll n,x;
vector<vector<ll>> a;
void dfs(ll u,ll res){
if(u == n){
if(res == x)
++cnt;
return;
}
for(auto c : a[u]){
if(res > x/c) continue;
dfs(u+1,res*c);
}
}
void solve()
{
cin>>n>>x;
a.resize(n);
for(int i=0;i<n;i++){
int l;cin>>l;
a[i].resize(l);
for(int j = 0 ;j<l;j++){
cin>>a[i][j];
}
}
dfs(0,1);
cout<<cnt<<endl;
}