题意:给你N个包,每个包里n个值,从每个包里取一个数,要求这N个数乘积等于X,问有多少种这样的情况。
思路:
深搜,首先我们可以想到设置当前值为1,然后乘每一层的数,然 0<ai < 1e9这样乘到最后可能超long long ,所以设初始值为X,向下除,除到1 return。
代码
#include <bits/stdc++.h>
#define endl "\n"
#define rep(i, m, n) for (int i = (m); i <= (n); ++i)
#define rrep(i, m, n) for (int i = (m); i >= (n); --i)
#define IOS ios::sync_with_stdio(0); cin.tie(0);
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10, mod = 1e9 + 7;
int N,n,a,ans=0;
ll X;
vector<int> v[maxn];
void dfs(int idx = 1,ll now = X){
if(idx == N+1) {
if(now == 1) ans++;
return;
}
for(auto &it : v[idx]){
if(now % it == 0){ //如果能整除
dfs(idx+1,now/it);
}
}
}
void solve() {
IOS
cin >> N >> X;
rep(i,1,N){
cin >> n;
rep(j,1,n){
cin >> a;
if(X % a == 0) v[i].push_back(a);
}
}
dfs();
cout << ans;
}
int main() {
solve();
return 0;
}