codevs 1009 产生数 题解报告
2016-10-16 20:23
417 查看
继续我的刷题路;
题目描述 Description
给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:n=234。有规则(k=2):
2-> 5
3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数
问题:
给出一个整数 n 和 k 个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入描述 Input Description
键盘输人,格式为:
n k
x1 y1
x2 y2
… …
xn yn
输出描述 Output Description
屏幕输出,格式为:
一个整数(满足条件的个数)
样例输入 Sample Input
234 2
2 5
3 6
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
看题意,可以想到组合数的问题,,
不过,,
我不会
2333333333333333333
所以
我写了搜索
因为
只有 0-9 10个数嘛
每个数有一定的k种变化
用f[i]表示所以最后的答案就是每一位上的数 的变化次数之积;
所以只需要DFS处理出每个数可以扩展到的数的个数就好了~~
相信不难理解,就不写注释了。
4000
题目描述 Description
给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:n=234。有规则(k=2):
2-> 5
3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数
问题:
给出一个整数 n 和 k 个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入描述 Input Description
键盘输人,格式为:
n k
x1 y1
x2 y2
… …
xn yn
输出描述 Output Description
屏幕输出,格式为:
一个整数(满足条件的个数)
样例输入 Sample Input
234 2
2 5
3 6
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
看题意,可以想到组合数的问题,,
不过,,
我不会
2333333333333333333
所以
我写了搜索
因为
只有 0-9 10个数嘛
每个数有一定的k种变化
用f[i]表示所以最后的答案就是每一位上的数 的变化次数之积;
所以只需要DFS处理出每个数可以扩展到的数的个数就好了~~
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #include<cstdlib> #include<string> #include<bitset> #include<iomanip> #include<deque> #define INF 1000000000 #define fi first #define se second #define N 100005 #define P 1000000007 #define debug(x) cerr<<#x<<"="<<x<<endl #define MP(x,y) make_pair(x,y) using namespace std; int n,m,f[101],q[10][10],a[1010]; bool v[10]; long long sum[10]; long long ans=1; long long dfs(long long x) { long long ansm=1; for(long long i=0;i<=9;i++) { if(!v[i]&&q[x][i]) { v[i]=1; ansm+=dfs(i); } } return ansm; } int main() { char c; long long k=0; string s; cin>>s;k=s.size(); for(long long i=0;i<k;i++) { sum[s[i]-'0']++; a[1+i]=s[i]-'0'; } cin>>n; for(long long i=1;i<=n;i++) { long long w,e; cin>>w>>e; q[w][e]=1; } for(long long i=1;i<=k;i++) { memset(v,0,sizeof(v)); v[a[i]]=1; ans*=dfs(a[i]); } cout<<ans; }
相信不难理解,就不写注释了。
4000
相关文章推荐
- CodeVS1009[NOIP2002(普及组)] 产生数【Floyd】
- codevs1009 产生数
- codevs1009 产生数
- codevs 2488 绿豆蛙的归宿 题解报告
- codevs 2618 核电站问题 题解报告
- codevs 1009 产生数 2002年NOIP全国联赛普及组 x (内附解析w)
- codevs 1060 搞笑世界杯 题解报告
- codevs 1019 集合论与图论 题解报告
- codevs 1036 商务旅行 题解报告
- codevs 1058 合唱队形 题解报告
- codevs 1065 01字符串 题解报告
- CODE [VS] 1009 产生数 (用Floyd算法求解传递闭包)
- codevs 1228 苹果树 题解报告
- codevs 1961 躲避大龙 题解报告
- Codevs 1009 产生数
- 【日常学习】【floyd传递闭包+高精】codevs1009 产生数题解
- codevs1009 产生数
- codevs 2833 奇怪的梦境 题解报告
- codevs 3301 Square words 题解报告
- codevs 1045 回文数 题解报告