AtCoder abc233_c题解

题意:给你N个包,每个包里n个值,从每个包里取一个数,要求这N个数乘积等于X,问有多少种这样的情况。
思路:
深搜,首先我们可以想到设置当前值为1,然后乘每一层的数,然 0 代码

#include 
#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;
}

你可能感兴趣的:(深搜dfs,AtCoder,c语言,深度优先,算法)