产生数
来源:互联网 发布:淘宝电商差评怎么回复 编辑:程序博客网 时间:2024/04/30 21:16
题目描述
给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。
规则:
一位数可变换成另一个一位数:
规则的右部不能为零。
例如:n=234。有规则(k=2):
2-> 5
3-> 6
上面的整数 234 经过变换后可能产生出的整数为(包括原数):
234
534
264
564
共 4 种不同的产生数
问题:
给出一个整数 n 和 k 个规则。
求出:
经过任意次的变换(0次或多次),能产生出多少个不同整数。
仅要求输出个数。
输入
n k
x1 y1
x2 y2
… …
xn yn
234 2
2 5
3 6
输出
一个整数(满足条件的个数):
4
思路
这题可以以用乘法原理到
然后用floyd求出每一个数可以到达的其它的数,
然后要注意每一个数可能有多个,所以就要将某些数反复加
然后因为数会很大,所以要用实型或高精度进行计算
#include <stdio.h>#include <string>using namespace std;bool a[11][11];long long f[11],b[11],c[11],d[11];int main(){ char st[50]; int n; for (int i=0;i<=9;i++) f[i]=1; scanf("%s %d",&st,&n); for (int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); a[x][y]=1; } for (int k=0;k<=9;k++) for (int i=0;i<=9;i++) for (int j=0;j<=9;j++) a[i][j]=a[i][j] or (a[i][k] and a[k][j]); for (int i=0;i<=9;i++) { for (int j=0;j<=9;j++) if (a[i][j]==1&&i!=j) { f[i]++; } } for (int i=0;i<=9;i++) c[i]=f[i]; for (int i=0;i<=strlen(st)-1;i++) { d[int(st[i])-int('0')]=1; if (b[int(st[i])-int('0')]>=1) { f[int(st[i])-int('0')]=f[int(st[i])-int('0')]*c[int(st[i])-int('0')]; } b[int(st[i])-int('0')]++; } double ans=1; for (int i=0;i<=9;i++) if (d[i]==1) ans=ans*f[i]; printf("%0.0lf",ans);}
1 0
- 产生数
- 产生数
- 产生数
- 产生数
- 产生数
- 产生数
- 产生一万个随即数
- 【图论】【RQNOJ】产生数
- 随机产生不同数
- oracle产生十六进制数
- NOIP2002 产生数
- Codevs 1009 产生数
- vijos P1129 产生数
- NOIP2002 产生数
- P1129 产生数
- 1009 产生数 MARK
- 产生任意数
- 随机产生数
- qt qml 九宫格划指锁屏视图
- fatal error: libmemcached/memcached.h: No such file or directory
- 关于node.js的学习16
- C#导出EXCEL文件,过长的数值被显示为科学技术法
- TextUtils类中的isEmpty,isDigitsOnly
- 产生数
- qt qml 刮刮卡效果
- H.264编解码技术[原始积累二]
- C++引用
- JAVA中堆和栈的区别
- HashMap解决hash冲突的方法
- NOIP2016提高组复赛赛后总结
- Android无源码调试Native代码(使用GDB)
- rabbitmq集群节点操作