列表

详情


NC205069. 恶魔果实

描述

牛牛得到了一堆神奇的恶魔果实,每个恶魔果实都给了牛牛一个改变数字的能力,可以把数字a变成数字b,现在牛牛有一个数字x,他想知道吃完这n个恶魔果实后,他可以把数字x变成多少种的数。
注:每一个恶魔果实的能力可以重复使用多次,当然也可以不用,存在相同能力的恶魔果实.

输入描述

第一行输入一个正整数x(1≤x≤109),和一个正整数n(1≤n≤106),接下来n行,每行一个a(0≤a≤9 )和一个b(1≤b≤9)。

输出描述

表示可以变的数字种类数,答案对104+7取模

示例1

输入:

456 3
5 6
4 5
4 5

输出:

6

说明:

456 556 656 466 566 666

示例2

输入:

111 1
1 2

输出:

8

说明:

111 112 121 122 211 212 221 222

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 157ms, 内存消耗: 612K, 提交时间: 2020-06-21 12:15:17

#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
const int N=10,mod=1e4+7;
typedef long long ll;
set<int>e[N];
int x,n,a,b;
ll ans=1;
void dfs(set<int> &s,int u){
 	 s.insert(u);
	 for(auto v:e[u]) 
	 	if(!s.count(v)) dfs(s,v);
}
int main(){
	scanf("%d%d",&x,&n);
	while(n--){
		scanf("%d%d",&a,&b);
		e[a].insert(b);
	}
	while(x){
		set<int>s;
		dfs(s,x%10),ans=ans*s.size()%mod,x/=10;
	}
	printf("%lld\n",ans);
} 

C++11(clang++ 3.9) 解法, 执行用时: 396ms, 内存消耗: 392K, 提交时间: 2020-06-20 20:29:01

#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
set<int> G[10];
void dfs(int x,set<int> &vis)
{
	vis.insert(x);
	for(int c:G[x])
		if(vis.count(c)==0) 
			dfs(c,vis);
}
int main()
{
	int x,n;
	cin>>x>>n;
	for(int i=1;i<=n;i++)
	{
		int u,v;
		cin>>u>>v;
		G[u].insert(v);
	}
    long long ans=1;
    while(x)
	{
		set<int> v;
		dfs(x%10,v);
		ans=ans*v.size()%mod;
		x/=10;
	}
	cout<<ans<<endl;
	return 0;
}

上一题