CodeVs 1009
来源:互联网 发布:萧然网络问政瓜沥 编辑:程序博客网 时间:2024/06/06 00:52
题意:
给出一个整数 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;}
0 0
- CodeVs 1009
- Codevs 1009 产生数
- 【codevs 1009】产生数
- Codevs 1009 产生数
- Codevs
- NOIP2008 立体图 Codevs 1149 Tyvj 1009
- codevs 1009 产生数 题解报告
- codevs 1009 产生数 Floyd 解题报告
- codevs 1009 产生数 floyd算法
- codevs 1060
- [CodeVS]3304
- codevs 4248
- Codevs 苹果树
- Codevs 挂缀
- Codevs 加密算法
- CodeVs 1011
- codevs 买票
- codevs 1257
- HNU 2015暑期新队员训练赛2 H Blanket
- CF D. One-Dimensional Battle Ships
- LA 6893 矩阵HASH (模板)
- IOS 开发环境,证书和授权文件是什么?
- Fragment的使用(四)
- CodeVs 1009
- POJ 1006 同余方程组
- CodeVs 3150 (大数 + 递推)
- Jquery+Pdo编写login登陆界面
- HDU 5377 (Exgcd + 原根)
- HDU 1695 GCD
- HDU 1796 (容斥原理)
- HDU 1069
- HDU 1074 (DP + 状态压缩)