恶魔果实

组合题(牛客): 恶魔果实.

题目描述
牛牛得到了一堆神奇的恶魔果实,每个恶魔果实都给了牛牛一个改变数字的能力,可以把数字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

相当于求x各个位上的数的变化数相乘;

#include<bits/stdc++.h>
#define ll long long 
#define mod 1000000007
#define pi acos(-1)
using namespace std;

int main(){
	int a[10][10]={0};
	int x,n;
	cin>>x>>n;
	while(n--){
		int u,v;
		cin>>u>>v;
		a[u][v]=1;					//果实能力,1代表可变
	}
	for(int i = 0; i < 10; i++){
		a[i][i]=1;					//不变,相当于不吃果实
		for(int j = 0; j < 10; j++){
			for(int k = 0; k < 10; k++){
				if(a[i][k] && a[k][j]) a[i][j]=1;
			}
		}
	}
	int ans = 1;
	while(x){				//每一位遍历
		int sum = 0;
		for(int i = 0; i < 10; i++){
			if(a[x%10][i]) sum++;		
		}
		ans=ans*sum%10007;
		x/=10;
	}	
	cout<<ans<<endl;
	
	return 0;
}

你可能感兴趣的:(题解)