https://www.luogu.org/problem/P1037

题目描述

给出一个整数 n(n<1030) 和 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

输出描述:

一个整数(满足条件的个数)

示例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+高精度)的更多相关文章

  1. NOIP 2002提高组 选数 dfs/暴力

    1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...

  2. NOIP 2018 普及组 解题报告

    目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...

  3. 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题

    洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...

  4. NOIP2002pj产生数[floyd 高精度]

    背景 给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15). 规则:一位数可变换成另一个一位数:规则的右部不能为零. 例如:n=234.有规则(k=2):2-> 53 ...

  5. NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...

  6. 开心的金明 NOIP 2006 普及组

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就 ...

  7. NOIP 2002 提高组 字串变换

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

  8. NOIp 2018 普及组

    T1标题统计 传送门 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大.小写英文字母.数字字符.空格和换行符.统计标题字 符数时,空格和换行符不计算在内. ...

  9. 【NOIP】普及组2011 表达式的值

    [算法]动态规划+后缀表达式 [题解] 先把算式转为后缀表达式后进行DP 令f[s][0]表示使表达式答案为0的方案数 f[s][1]表示使表达式答案为1的方案数 (加法) f[a+b][1]=f[a ...

随机推荐

  1. python从命令窗口启动脚本 创建并写入内容到文件示例

    写入到文件示例: #!/usr/bin/env python3 from math import exp, log, sqrt import re from datetime import date, ...

  2. python刷LeetCode:20. 有效的括号

    难度等级:简单 题目描述: 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序 ...

  3. 代码神器:拒绝重复编码,这款IDEA插件了解一下.....

    作者:HeloWxl www.jianshu.com/p/e4192d7c6844 Easycode是idea的一个插件,可以直接对数据的表生成entity.controller.service.da ...

  4. Sequence Models Week 1 Character level language model - Dinosaurus land

    Character level language model - Dinosaurus land Welcome to Dinosaurus Island! 65 million years ago, ...

  5. pycharm 的 使用 设置智能目录 Pycharm 断点跳转及 Step Over/Step Into/Step Out 等的区别

    pycharm  右键点击文件夹  有个mark directiory as  根据需要给目录进行设置 Pycharm调试程序时,有时需要直接从第一个断点跳转至第二个断点,如果还是用单步调试的话就非常 ...

  6. clion 的 安装 变量配置的 搬运工(有点基础应该能看 大家看不懂 就是我自己看 哈哈哈哈哈哈)

    1  自行安装一个  clion 2 https://blog.csdn.net/u013023297/article/details/80723847   mingw  的配置    第二篇好像当时 ...

  7. BZOJ [Cqoi2017] 小Q的棋盘

    题解:枚举最后在哪里停止,然后剩下的步数/2 也就是找最大深度 枚举终止位置算是一种思路吧 #include<iostream> #include<cstdio> #inclu ...

  8. 计算机网络(1): http原理和uuid

    http 的请求报文和响应报文格式 请求报文有哪些方法 一个典型的http报文 状态码有哪几种 以及短语是用来解释状态码的 接口测试中,需要使用到UUID,用来生成唯一ID. 1.什么是UUID UU ...

  9. python进阶(三)~~~装饰器和闭包

    一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...

  10. 阿里云云服务器测试uwgis的基本流程

    基本背景 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI / uwsg ...