当前位置: 首页 > news >正文

题解:洛谷 P1037 [NOIP 2002 普及组] 产生数

【题目来源】

洛谷:[P1037 NOIP 2002 普及组] 产生数 - 洛谷 (luogu.com.cn)

【题目描述】

给出一个整数 \(n\)\(k\) 个变换规则。

关于规则:

  • 一位数可变换成另一个一位数:
  • 规则的右部不能为零。

例如:\(n=234\),有 \(k=2\) 个规则:

  • \(2\rarr 5\)
  • \(3\rarr 6\)

上面的整数 \(234\) 经过变换后可能产生出的整数为(包括原数):

  • \(234\)
  • \(534\)
  • \(264\)
  • \(564\)

\(4\) 种不同的产生数。

给出一个整数 \(n\)\(k\) 个规则,请你计算,经过任意次的变换(\(0\) 次或多次),能产生出多少个不同整数。

仅要求输出个数。

【输入】

第一行包含两个整数 \(n,k\)

接下来 \(k\) 行,每行包含两个整数 \(x_i,y_i\),表示一条规则为 \(x_i\rarr y_i\)

【输出】

一个整数,表示能生出的不同整数的个数。

【输入样例】

234 2
2 5
3 6

【输出样例】

4

【算法标签】

《洛谷 P1037 产生数》 #高精度# #深度优先搜索DFS# #NOIP普及组# #2002#

【代码详解】

#include <bits/stdc++.h>  // 包含所有标准库头文件
using namespace std;const int N = 35;  // 定义常量:N为节点数量上限
int dist[11][11];  // dist[i][j]:数字i是否可以转换为数字j(1表示可以,0表示不可以)
int num[11];  // num[i]:数字i可以转换的数字种类数
string str;  // 存储输入的整数字符串
int k;  // 规则数量
int t[N];  // t[i]:整数第i位数字的变换种类数
vector<int> ans;  // 存储最终结果的每一位数字// Floyd-Warshall算法实现
void floyd()
{// 三重循环,k是中间节点,i是起点,j是终点for (int k = 1; k <= 9; k++)for (int i = 0; i <= 9; i++)for (int j = 0; j <= 9; j++)// 如果i可以转换为k,且k可以转换为j,则i可以转换为jif (dist[i][k] && dist[k][j])dist[i][j] = 1;
}// 高精度乘法:将高精度数A乘以整数b
vector<int> mul(vector<int> A, int b)
{int t = 0;  // 进位vector<int> C;  // 存储结果for (int i = 0; i < A.size() || t > 0; i++) {if (i < A.size()) t = A[i] * b + t;  // 计算当前位的乘积并加上进位C.push_back(t % 10);  // 将当前位的值加入结果t = t / 10;  // 计算进位}return C;  // 返回结果
}int main()
{cin >> str >> k;  // 输入整数字符串和规则数量// 初始化dist数组for (int i = 1; i <= k; i++) {int a, b;cin >> a >> b;  // 输入规则:a可以转换为bdist[a][b] = 1;  // 标记a可以转换为b}floyd();  // 调用Floyd-Warshall算法,计算所有数字之间的转换关系// 计算每个数字可以转换的数字种类数for (int i = 0; i <= 9; i++) {dist[i][i] = 1;  // 每个数字可以转换为自身for (int j = 0; j <= 9; j++)if (dist[i][j] == 1) num[i]++;  // 统计数字i可以转换的数字种类数}int len = str.size();  // 获取整数的位数// 计算每一位数字的变换种类数for (int i = 0; i < len; i++) {t[i] = num[str[i] - '0'];  // 将字符转换为数字,并获取其变换种类数}// 初始化结果为第一位数字的变换种类数ans.push_back(t[0]);// 依次乘以每一位数字的变换种类数for (int i = 1; i < len; i++) {vector<int> D = mul(ans, t[i]);  // 高精度乘法ans = D;  // 更新结果}// 输出结果(从高位到低位)for (int i = ans.size() - 1; i >= 0; i--) {cout << ans[i];}return 0;  // 程序结束
}

【运行结果】

234 2
2 5
3 6
4
http://www.jsqmd.com/news/394626/

相关文章:

  • 给游戏开发者的【海外 Steam 愿望单获取方法】
  • 2026污水池清洗企业排名,口碑佳选在这里!污水池清洗企业哪家好技术引领与行业解决方案解析 - 品牌推荐师
  • 掌握这些,2026选国内热门S系列减速机工厂不踩坑,硬齿面斜齿轮减速机/提升机减速机,S系列减速机实力厂家哪家强 - 品牌推荐师
  • C#异步和并发在IO密集场景的典型应用 async/await
  • 题解:洛谷 P3385 【模板】负环
  • 2026年大件物流哪家强?口碑厂家精选指南,大件运输/大件物流,大件物流服务商口碑排行 - 品牌推荐师
  • 看完马斯克的“编程末日”预言,我反而松了一口气
  • 题解:洛谷 P4779 【模板】单源最短路径(标准版)
  • 矩阵乘法与同维空间互相转换(以二维为例)
  • 世毫九理论体系·正式总目录
  • 题解:洛谷 P1600 [NOIP 2016 提高组] 天天爱跑步
  • 美团礼品卡回收实用指南解决闲置困扰 - 京顺回收
  • 题解:洛谷 P2052 [NOI2011] 道路修建
  • 题解:洛谷 P1351 [NOIP 2014 提高组] 联合权值
  • 题解:洛谷 P5836 [USACO19DEC] Milk Visits S
  • YOLO26涨点改进 | 全网独家创新、注意力改进篇 | SCI一区 2025 | YOLO26引入MSCA多尺度稀疏交叉聚合,GCBAM分组注意力,助力遥感目标检测、图像分类任务有效涨点
  • 题解:洛谷 P3128 [USACO15DEC] Max Flow P
  • 题解:洛谷 P3379 【模板】最近公共祖先(LCA)
  • 题解:洛谷 P1395 会议
  • Claude Sonnet 4.6发布,操控计算机能力大幅提升,100万token上下文
  • 京东 e 卡闲置别浪费!可可收更安心,这样选最省心 - 可可收
  • 题解:洛谷 P3372 【模板】线段树 1
  • 研磨废水回用厂家怎么挑?2026年攻略来了,实验室废水处理/研磨废水回用(处理)/零排放清洗,研磨废水回用源头厂家找哪家 - 品牌推荐师
  • 题解:洛谷 P1099 [NOIP 2007 提高组] 树网的核
  • 闲置支付宝立减金别浪费!合规回收方法来了,新手也能轻松上手 - 可可收
  • Python3教程梳理
  • 题解:洛谷 P5908 猫猫和企鹅
  • 题解:洛谷 P5677 [GZOI2017] 配对统计
  • 2026沸石转轮一体机企业TOP榜:哪些品牌值得关注?催化燃烧/旋风除尘器/除尘器,沸石转轮制造厂家排行榜单 - 品牌推荐师
  • 瑞祥商联卡闲置不用?这样的合规回收方式,新手也能轻松上手 - 可可收