AtCoder Beginner Contest 233 C - Product
問題の要約
N個の袋がある。
袋iにはLi個のボールが入っていて、袋iのj(1<=j<=Li)番目のボールには正の整数ai,jが書かれている。
それぞれの袋から1つずつボールを取り出す。
取り出したボールに書かれた数の総積がXになるような取り出し方は何通りあるか?
ただし、書かれた数が同じであっても全てのボールは区別する。
制約
N>=2
Li>=2
袋に入っているボールの個数の総積は10^5を超えない。
1<=ai,j<=10^9
1<=X<=10^18
入力
N X
L1 a1,1 ... a1,L1
...
LN aN,1 ... aN,LN
考え方
1,ボールの個数の総積が10^5を超えないので、全探索すればよい。
実際のプログラム
#include<iostream>
#include<vector>
using namespace std;
long long ans;
void f(vector<vector<long long>> A, long long n, long long N, long long x, long long X){
if(X < x){
return;
}
if(n == N){
if(x == X){
ans++;
}
return;
}
for(long long i = 0; i < A[n].size(); i++){
long long a = A[n][i];
f(A,n+1,N,x*a,X);
}
return;
}
int main(){
long long N,X;
cin >> N >> X;
vector<vector<long long>> A(N);
for(long long i = 0; i < N; i++){
long long L;
cin >> L;
for(long long j = 0; j < L; j++){
long long a;
cin >> a;
A[i].push_back(a);
}
}
ans = 0;
f(A,0,N,1,X);
cout << ans << endl;
return 0;
}