《产生数》解题报告
                                            by MPS
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目描述 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

分析:

   数学建模:将一个数码抽象为点,能够变换抽象为边,那么很明显,我们对整个数字串扫描,如果遇到可以变换的,则乘上他的变化数目,这里之所以用乘是因为组合数学里的乘法原理。而求变换数目,则就是著名的传递闭包算法——Floyd_Warshall算法
   我们将能连通的两条边的权值看为true,然后再类似floyd的模型,疏通整个图的关系,保存到一个rule数组里去,然后再遍历即可。
   上述算法期望得分:60分?!
   为什么呢?
   很明显,变换之积可能爆了精度,所以我们要用高精度。高乘单,这里MPS又加了一个优化——快速傅里叶变换,不过给的程序里就不会那么繁琐了,能过就行了
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
bool map[10][10];
int rules[10];
int ans[1000000];
int len,n,k;
char s[100];
int main()
{  freopen("creat.in","r",stdin);freopen("creat.out","w",stdout);int i,j,k,x,y;cin>>s>>k;for(i=1;i<=k;i++){cin>>x>>y;map[x][y]=1;}for (int i=0;i<10;++i) map[i][i]=true;  for(k=0;k<=9;k++)for(i=0;i<=9;i++)for(j=0;j<=9;j++)map[i][j]=map[i][j]||(map[i][k] && map[k][j]);for(i=0;i<=9;i++)for(j=0;j<=9;j++)if(map[i][j])++rules[i];ans[1]=len=1;  for (int i=0;i<strlen(s);++i)  {  int x=rules[s[i]-'0'];  for (int j=1;j<=len;++j) ans[j]*=x;  for (int j=1;j<=len;++j)  {  ans[j+1]+=ans[j]/10;  ans[j]%=10;  }  while (ans[len])  {  ans[len+1]+=ans[len]/10;  ans[len]%=10;  ++len;  }  }  for (int i=len-1;i>0;--i) printf("%d",ans[i]);  return 0;
}  

------------------------------------------------------------------------------------------------------the end----------------------------------------------------------------------------------------------------

Codevs 1009 产生数相关推荐

  1. 1009 产生数 2002年NOIP全国联赛普及组

    009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个整数 n(n<10^ ...

  2. BP神经网络(手写数字识别)

    1实验环境 实验环境:CPU i7-3770@3.40GHz,内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据 ...

  3. 2023年你最值得了解的信息技术-AI篇(一)

    列表 85 - 其他 辽宁省 大连优联智能 自动化生产线提供商 未融资 大连优联智能是一家自动化生产线提供商,集规划设计.制造安装.系统集成.视觉检测及AI数据智能分析于一体,可为汽车车身及发动机制造 ...

  4. [CODEVS 1087] 麦森数

    描述 计算2P-1的位数和最后500位数字 分析 有一个公式,2^p的位数是p*lg2以十为底 2 的对数. 证明 : 2p=10lg2p=10p∗lg2 2^p = 10^{lg2^p} = 10^ ...

  5. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

  6. [codevs 1227] 方格取数2

    [codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...

  7. codevs 1227 方格取数 2

    Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...

  8. AC日记——丑数 codevs 1246

    1246 丑数 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果 题目描述 Description 对于一给定的素数集合 ...

  9. codevs 1043 方格取数 2000年NOIP全国联赛提高组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...

最新文章

  1. easyui datalist 动态绑定数据_一文看懂动态链接
  2. 机器学习该如何应用到量化投资系列(二)
  3. Python函数的非固定参数
  4. 江苏省事业单位计算机入面分数线,2020江苏事业单位统考周日笔试,考多少分进面?...
  5. java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
  6. QML基础类型之real
  7. IntelliJ IDEA 使用随笔
  8. System.gc()调用 - 适用的场景
  9. 零基础入门深度学习(5) - 循环神经网络
  10. DataSet与DataReader的区别
  11. kubernetes资源对象--pod和job
  12. spring @Bean注解的使用
  13. MySQL 5.7 参考手册(官方中文版) | 2.2 安装和升级MySQL
  14. 【学习】从零开始的Android音视频开发(6)——MediaPlayerService中BinderDriver、创建播放器过程、建立StageFright层交互
  15. Java编一个收银小票_Java编程打印购物小票实现代码
  16. 本地颁发 SSL 证书,并开启 https 服务调试
  17. 墙裂推荐一个高质量的数据分析学习平台
  18. 如何使用ANSYS workbench导出最清晰的图的步骤
  19. python 中dtype 为object_DataFrame中的字符串,但dtype是对象
  20. Python 1-02 基础语法

热门文章

  1. Android集成友盟第三方登录
  2. 苹果iOS系统最新市占率统计:iOS 11份额达到52%
  3. 学习mysql_day2
  4. cypress 断言--should
  5. [Swift]LeetCode93. 复原IP地址 | Restore IP Addresses
  6. 鲁泰纺织:在行业整合中稳健前行
  7. 谁是西方历史上“第一个”数学家?
  8. 如何避免用户“漫天要价”和“就地还钱”
  9. 当AI入职FBI,克格勃直呼内行
  10. 智能家居系统的开源尝试