ABC233 C-Product(dfs)
https://atcoder.jp/contests/abc233/tasks/abc233_c
题目大意:
我有n个包包,每个包包里面有k个球,k个球中都标记着数字
我的任务是需要从每一个包包里面都拿出一个球,它们的乘积能达到x。
输入格式:
N X
N1 (N1个球)
N2 (N2个球)
......
输入样例:
Sample Input 1
2 40
3 1 8 4
2 10 5
Sample Output 1
2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=200200;
vector<LL> v[N];
LL n,x,ans=0;
void dfs(LL sum,LL idx)
{
if(idx==n+1)//如果都已经抓完了这些包包,就可以来判断一下可不可以凑到答案的
{
if(sum==x) ans++;//找到一个答案
return;
}
if(sum>x) return;//如果都直接还没找完就比它大了,直接抛弃
for(int i=1;i<=v[idx][0];i++)//遍历这一个包包里面的所有
dfs(sum*v[idx][i],idx+1);
}
int main()
{
//cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
cin>>n>>x;
for(LL i=1;i<=n;i++)
{
int k;
cin>>k;
v[i].push_back(k);
for(int j=1;j<=k;j++)
{
int kk;
cin>>kk;
v[i].push_back(kk);
}
}
dfs(1,1);//总数一开始等于1,从第一个包包开始
cout<<ans<<endl;
return 0;
}