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;
}
posted @ 2022-07-27 17:44  Vijurria  阅读(54)  评论(0编辑  收藏  举报