yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

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