[NOIP 2002普及组]产生数(floyd+高精度)
https://www.luogu.org/problem/P1037
题目描述
规则:
一位数可变换成另一个一位数:规则的右部不能为零。
例如: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
输出描述:
一个整数(满足条件的个数)
示例1
输入
输出
多给一组数据吧,我第一次写的就这个没过
输入
输出
注意点:
1、一共有15种操作 说明一个数可以变成多个不同的数
如果存在 2个操作 a->b b->c 则a既可以变到b也可以变到c
所以可以通过DFS或floyd求出每个数字可以变成多少种数字
2、最多可能有30位数 所以最大可能9^30
需要模拟大数乘法 而每次乘数有一个 不超过10 所以并不难
故floyd+高精度秒杀,用floyd求出每个数字可以变成多少种数字,然后乘起来
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const double PI=acos(-);
const int maxn=;
using namespace std;
//ios::sync_with_stdio(false);
// cin.tie(NULL); int k;
char str[];
int tag[][];//tag[i][j]=1代表数字i可变成j
int num[];//存放每个数字可变换数字的个数
int ans[];//答案 int main()
{
scanf("%s %d",str,&k);
for(int i=;i<=k;i++)
{
int a,b;
scanf("%d %d",&a,&b);
tag[a][b]=;
}
for(int k=;k<=;k++)//floyd
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(tag[i][k]&&tag[k][j])
tag[i][j]=;
}
}
}
for(int i=;i<=;i++)
{
tag[i][i]=;
for(int j=;j<=;j++)
{
if(tag[i][j])
num[i]++;
}
}
//高精度乘法
ans[]=;//初始答案
int jinwei;//进位
int weishu=;//位数
for(int i=;str[i];i++)
{
jinwei=;
int x=num[str[i]-''];//该位置数字可变多少种数字
for(int j=;j<weishu;j++)
{
int t=ans[j]*x+jinwei;
ans[j]=t%;
jinwei=t/;
}
while(jinwei)
{
ans[weishu++]=jinwei%;
jinwei/=;
}
}
for(int i=weishu-;i>=;i--)//注意要反着输出
{
printf("%d",ans[i]);
}
printf("\n");
return ;
}
下面粘另一种写法,主要用了DFS,复杂度可能小一点(from:https://blog.csdn.net/AXuan_K/article/details/41479705)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int op[][];
char str[];
int vis[];
int value[];
int maxlen=;
void dfs(int a) //搜索出每个数可以到达的数的个数 用SS保存
{
if(vis[a])
return;
vis[a]=;
ss++;
for(int i=;i<=;i++)
{
if(op[a][i]==)
dfs(i);
}
}
void multiple(int x) //最大可能 9^30 超long long 所有模拟大数乘法
{
int carry=; //carry表示进位
for(int i=;i<=maxlen;i++)
{
value[i]=value[i]*x+carry;
carry=value[i]/;
value[i]=value[i]%;
}
if(carry>)
value[++maxlen]=carry;
return;
}
int main()
{
int m,n,i,j,k;
int s;
value[]=;
memset(op,,sizeof(op));
scanf("%s%d",str,&k);
int a,b;
if(k==)
{
cout<<<<endl;
return ;
}
while(k--)
{
scanf("%d%d",&a,&b);
op[a][b]=; //op[a][b]代表a可以到b
}
int len=strlen(str);
for(i=;i<len;i++)
{
memset(vis,,sizeof(vis));
ss=;
dfs(str[i]-''); //求出每位可转换数的乘积 //其实可以用一个数组保存每个数可转换的数的个数
multiple(ss);
}
for(i=maxlen;i>=;i--)
cout<<value[i];
cout<<endl;
return ;
}
[NOIP 2002普及组]产生数(floyd+高精度)的更多相关文章
- NOIP 2002提高组 选数 dfs/暴力
		
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...
 - NOIP 2018 普及组 解题报告
		
目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...
 - 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题
		
洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...
 - NOIP2002pj产生数[floyd 高精度]
		
背景 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则:一位数可变换成另一个一位数:规则的右部不能为零. 例如:n=234.有规则(k=2):2-> 53 ...
 - NOIP 2015普及组复赛Day1 T1  == Codevs4510 神奇的幻方
		
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...
 - 开心的金明 NOIP 2006 普及组
		
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就 ...
 - NOIP 2002 提高组 字串变换
		
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
 - NOIp 2018 普及组
		
T1标题统计 传送门 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大.小写英文字母.数字字符.空格和换行符.统计标题字 符数时,空格和换行符不计算在内. ...
 - 【NOIP】普及组2011 表达式的值
		
[算法]动态规划+后缀表达式 [题解] 先把算式转为后缀表达式后进行DP 令f[s][0]表示使表达式答案为0的方案数 f[s][1]表示使表达式答案为1的方案数 (加法) f[a+b][1]=f[a ...
 
随机推荐
- python从命令窗口启动脚本 创建并写入内容到文件示例
			
写入到文件示例: #!/usr/bin/env python3 from math import exp, log, sqrt import re from datetime import date, ...
 - python刷LeetCode:20. 有效的括号
			
难度等级:简单 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序 ...
 - 代码神器:拒绝重复编码,这款IDEA插件了解一下.....
			
作者:HeloWxl www.jianshu.com/p/e4192d7c6844 Easycode是idea的一个插件,可以直接对数据的表生成entity.controller.service.da ...
 - Sequence Models Week 1 Character level language model - Dinosaurus land
			
Character level language model - Dinosaurus land Welcome to Dinosaurus Island! 65 million years ago, ...
 - pycharm  的 使用  设置智能目录    Pycharm 断点跳转及 Step Over/Step Into/Step Out 等的区别
			
pycharm 右键点击文件夹 有个mark directiory as 根据需要给目录进行设置 Pycharm调试程序时,有时需要直接从第一个断点跳转至第二个断点,如果还是用单步调试的话就非常 ...
 - clion 的 安装 变量配置的  搬运工(有点基础应该能看  大家看不懂 就是我自己看 哈哈哈哈哈哈)
			
1 自行安装一个 clion 2 https://blog.csdn.net/u013023297/article/details/80723847 mingw 的配置 第二篇好像当时 ...
 - BZOJ [Cqoi2017] 小Q的棋盘
			
题解:枚举最后在哪里停止,然后剩下的步数/2 也就是找最大深度 枚举终止位置算是一种思路吧 #include<iostream> #include<cstdio> #inclu ...
 - 计算机网络(1): http原理和uuid
			
http 的请求报文和响应报文格式 请求报文有哪些方法 一个典型的http报文 状态码有哪几种 以及短语是用来解释状态码的 接口测试中,需要使用到UUID,用来生成唯一ID. 1.什么是UUID UU ...
 - python进阶(三)~~~装饰器和闭包
			
一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...
 - 阿里云云服务器测试uwgis的基本流程
			
基本背景 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uwsg ...