1009 产生数 2002年NOIP全国联赛普及组
1009 产生数
2002年NOIP全国联赛普及组
给出一个整数 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
思路:
符合变换规则的数可以在变换一次后的新数仍然符合变换规则
所以我们考虑将之转化为一个图论问题
就是考虑从i到j需要经过多少点
经过的点的个数就是可以变换成的数
可是怎么求呢?
用弗洛伊德算法
弗洛伊德是个n^3的动态规划
枚举三个点i,j,k
如果i到j的距离大于i到k加上k到i的距离就会更新i到j的距离
根据这个原理我们可以增加一个计数器
即每更新一次i到j的距离则i的变换数的个数加1
因为n的本身也算是一种排列
所以所有数的变换个数初始为1、
将所有的变换数的个数都求出后
可以通过相乘的积得出总个数
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long ans=,num[];
int n,map[][];
char cur[];
int main()
{
memset(map,/,sizeof(map));
scanf("%s",cur);
scanf("%d",&n);
for(int a,b,i=;i<=n;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=;
}
for(int k=;k<=;k++)
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(i!=j&&j!=k&&k!=i)
if(map[i][k]+map[k][j]<map[i][j])
{
map[i][j]=map[i][k]+map[k][j];
}
}
}
}
for(int i=;i<=;i++)
{
num[i]++;
for(int j=;j<=;j++)
{
if(j==i) continue;
if(map[i][j]<) num[i]++;
}
}
for(int i=;i<strlen(cur);i++) ans=(ans*num[(int)(cur[i]-'')]);
cout<<ans<<endl;
return ;
}
1009 产生数 2002年NOIP全国联赛普及组的更多相关文章
- codevs 1009 产生数 2002年NOIP全国联赛普及组 x (内附解析w)
题目描述 Description 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则: 一位数可变换成另一个一位数: 规 ...
- 1008 选数 2002年NOIP全国联赛普及组
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description ...
- 选数 2002年NOIP全国联赛普及组
题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整 ...
- Codevs 1010 过河卒 2002年NOIP全国联赛普及组
1010 过河卒 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 如图,A 点有一个过河卒 ...
- 1010 过河卒 2002年NOIP全国联赛普及组codevs
1010 过河卒 2002年NOIP全国联赛普及组codevs 题目描述 Description 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点 ...
- 【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组
f(i,j)=f(i-1,j)+f(i,j-1),显然可以暴力递归求解,但是很多重复的状态,所以可以记忆下来. 注意障碍点和边界的特判. #include<cstdio> #include ...
- 1043 方格取数 2000年NOIP全国联赛提高组
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N* ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- Codevs 1140 Jam的计数法 2006年NOIP全国联赛普及组
1140 Jam的计数法 2006年NOIP全国联赛普及组 传送门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Jam是个喜欢标 ...
随机推荐
- 关于使用 CALayer 中 mask 的一些技巧
CALayer 拥有 mask 属性,Apple 的官方解释如下: An optional layer whose alpha channel is used to mask the layer’s ...
- 关于Mysql查询varchar类型错误问题
因为后台所有表ID都是按照雪花算法生成的18位数字,需要对接到Android,Ios和H5,此时H5会出现字符超长溢出,所以直接把ID改为varchar类型. 如我的一张表ID为varchar(18) ...
- 【QT】QString类型转换为const char*(toLatin1)
Qstring str = "helloworld"; char *s; QByteArray ba = str.toLatin1(); s = ba.data(); toLati ...
- xss练习平台及writeup
今天玩了一天的xss. 分享几个xss game https://xss.haozi.me/#/0x00 http://47.94.13.75/test/ writeup:http://www.cn ...
- Emacs 快速指南 - 原生中文手册
Emacs 快速指南 -折叠目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RES ...
- Kali-linux Arpspoof工具
Arpspoof是一个非常好的ARP欺骗的源代码程序.它的运行不会影响整个网络的通信,该工具通过替换传输中的数据从而达到对目标的欺骗.本节将介绍Arpspoof工具的 使用. 9.8.1 URL流量操 ...
- ThinkPHP5入门(三)----模型篇
一.操作数据库 1.数据库连接配置 数据库默认的相关配置在项目的application\database.php中已经定义好. 只需要在模块的数据库配置文件中配置好当前模块需要连接的数据库的配置参数即 ...
- Unity3D-射线效果
基于airplane_02 下面新建 Line Renderer 将上面的几个地方设置下 添加Script脚本: 脚本代码为: using System.Collections; using Syst ...
- PAT——1055. 集体照
拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位置为m ...
- 【luogu P1373 小a和uim之大逃离】 题解
题目链接:https://www.luogu.org/problemnew/show/P1373 想不出来状态 看了一眼题解状态明白了 dp[i][j][h][1/0] 表示在i,j点差值为h是小A还 ...