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. 优秀的linux学习网站

    从网络上拷贝别人归纳的列表. Linux优秀网站列表 国内 http://www.chinaunix.net/ 国内最火爆的unix/linux论坛 http://www.linuxforum.net ...

  2. vue element-ui Table数据解除自动响应方法

    在对列表Table进行数据编辑时,会存在table的增删改操作后,列表view也自动响应发生了变化,原因是赋值的数据是一个引用类型共享一个内存区域的.所以我们就不能直接连等复制,需要重新克隆一份新的数 ...

  3. python 发送邮件,并且带附件

    #!/usr/bin/pythonfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultiparti ...

  4. 7. react 基础 - React Developer Tools 的安装 及 使用

    1. 安装 react 开发调试工具 React Developer Tools 打开 chrome 浏览器访问 chrome://extensions/ 点击右上角的 拓展程序 -> 打开 c ...

  5. 关于域名转发proxy_pass

    在配置nginx的时候,有一个需求,访问m.XXX.com的时候,需要实际访问www.YYY.com/m,并且域名不能发生变化. 达成这个需求有两种做法: 第一种就是301跳转,使用rewrite来跳 ...

  6. webservice wsdl文件标签讲解

    <?xml version="1.0" encoding="utf8"?> <wsdl:definitions targetNamespace ...

  7. 文献阅读报告 - Social LSTM:Human Trajectory Prediction in Crowded Spaces

    概览 简述 文献所提出的模型旨在解决交通中行人的轨迹预测(pedestrian trajectory prediction)问题,特别是在拥挤环境中--人与人交互(interaction)行为常有发生 ...

  8. Cf水题B - Combination

    地址: https://vjudge.net/problem/27861/origin Ilya plays a card game by the following rules. A player ...

  9. 用tkinter写一个记事本程序(未完成)

    之前在看tkinter与python编程 ,后面学opengl就把那本书搁置了.几天没用tkinter,怕是基本的创建组件那些都忘记了,所以想着用tkinter试着写一下记事本程序.一开始的时候以为很 ...

  10. mui 上拉加载

    最近做到移动端页面的开发,需要mui 的上拉刷新功能,最后实现后整理代码如下: 1.需要引入的js <link href="../resource/css/mui.min.css&qu ...