题意:
给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:n=234。有规则(k=2):
2-> 5
3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数
问题:
给出一个整数 n 和 k 个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
关键在于求传递闭包,BFS可以求
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<vector> #include<string> #include<queue> using namespace std; typedef unsigned long long ULL; vector<int> Next[20]; set<int> Num[20]; int main () { string s;int k,a,b; cin >> s >> k; for(int i = 0; i < 10; ++i) Num[i].insert(i); for(int i = 0; i < k; ++i) { cin >> a >> b; Next[a].push_back(b); } for(int i = 0; i < 10; ++i) { queue<int> Q; for(int j = 0; j < Next[i].size(); ++j) Q.push(Next[i][j]); while(!Q.empty()) { int c = Q.front(); Q.pop(); if(Num[i].count(c)) continue; Num[i].insert(c); for(int k = 0; k < Next[c].size(); ++k) { if(!Num[i].count(Next[c][k])) Q.push(Next[c][k]); } } } ////////////// //for(int i = 0; i < 10; ++i) cout << Num[i].size() << endl; int len = s.length(); ULL ans = 1; for(int i = 0; i < len; ++i) { int c = s[i] - ‘0‘; ans = ans * (ULL)Num[c].size(); } cout << ans << endl; }
时间: 2024-10-21 04:37:25