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

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

题目描述

给出一个整数 nk 个变换规则。

规则:

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

例如:n=234,k=2。有以下两个规则:

  • 2⟶5。
  • 3⟶6。

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

  • 234。
  • 534。
  • 264。
  • 564。

共 4 种不同的产生数。

现在给出一个整数 nk 个规则。求出经过任意次的变换(0 次或多次),能产生出多少个不同整数。

仅要求输出个数。

输入格式

第一行两个整数 n,k,含义如题面所示。

接下来 k 行,每行两个整数 x**i,y**i,表示每条规则。

输出格式

共一行,输出能生成的数字个数。

输入输出样例

输入 #1复制

234 2
2 5
3 6

输出 #1复制

4

说明/提示

对于 100% 数据,满足 $n<10^30$,k≤15。

算法分析

对于n的每一位,都可以用DFS跑一边,看看有多少种形态,最后把每一位算出来的形态种数相乘就可以了。但注意到n最多有30位,每位最多有9种形态,答案最大有$9^30$,用long long会直接爆炸,怎么办呢?有两种做法,一种刁钻的做法是用__int128存答案,但输出时只能用快写输出。还有一种做法是用万能的高精度做,简(fu)单(za)好(shao)写(nao)。

于是我们就得出了一下两种代码:

刁钻做法:

#include<bits/stdc++.h>
using namespace std;
string n;
int k;
int cnt = 0;
vector<int> b[15];
__int128 sum = 1;
bool vis[1005];
void print(__int128 t){//快些if(t<0){//此处可有可无putchar('-');t = 0-t;}if(t>9){print(t/10);}putchar(char(t%10+'0'));
}
void dfs(int x){//DFS遍历形态种数vis[x] = 1;cnt++;for(auto i : b[x]){if(vis[i]==0){dfs(i);}}
}
int main(){cin>>n>>k;for(int i = 1; i<=k; i++){int x,y;cin>>x>>y;b[x].push_back(y);}int len = n.size();for(int i = 0; i<len; i++){cnt = 0;memset(vis,0,sizeof(vis));int t = n[i]-'0';dfs(t);sum*=cnt;}print(sum);//输出方案数return 0;
}

高精度做法:

#include<bits/stdc++.h>
using namespace std;
string n;
int k;
int cnt = 0;
int len = 1;//高精度数的长度
vector<int> b[1005];
int a[1005];//高精度数组
bool vis[1005];
void print(){for(int i = len; i>=1; i--){cout<<a[i];}
}
void cheng(int t){//高精度函数int tlen = len;for(int i = 1; i<=len; i++){a[i]*=t;//每位都先乘一遍}for(int i = 1; i<=tlen; i++){if(a[i]>9){if(i==len){//位数不够,长度+1len++;}a[i+1]+=a[i]/10;//进位a[i]%=10;}}
}
void dfs(int x){//DFS遍历形态种数vis[x] = 1;cnt++;for(auto i : b[x]){if(vis[i]==0){dfs(i);}}
}
int main(){cin>>n>>k;for(int i = 1; i<=k; i++){int x,y;cin>>x>>y;b[x].push_back(y);}a[1] = 1;//初始化int tlen = n.size();for(int i = 0; i<tlen; i++){cnt = 0;memset(vis,0,sizeof(vis));int t = n[i]-'0';dfs(t);cheng(cnt);//调用函数}print();//输出return 0;
}
http://www.jsqmd.com/news/778577/

相关文章:

  • Cerebellum:为AI应用构建结构化工作流与状态管理的“小脑”
  • 续上一篇文章在0-99自动计数中再加入程序复位功能(汇编语言,proteus,AT89C51中断的使用)
  • setup-cowork:把 Cowork 上手从「逛 marketplace」翻成「报岗位」
  • 信奥赛-二进制学习
  • 初创公司如何利用多模型选型平衡效果与预算
  • WinCC组态没问题,数据就是存不进U盘?手把手教你诊断西门子触摸屏USB接口‘假死’
  • 私有化AI对话应用GeekChat部署指南:从架构解析到实战配置
  • Spring Boot与Angular全栈预约系统实战:环境搭建到联调部署
  • 桌面应用Docker化实战:解决环境依赖与分发难题
  • 2026最新大数据技术学校/民办学校/大专学校推荐!华中优质院校权威榜单发布,实力靠谱湖南衡阳等地院校助力高质量升学就业 - 十大品牌榜
  • LogCabin数据模型揭秘:Tree结构在分布式存储中的应用
  • 软件定义无线电与认知无线电技术解析及应用
  • 科研小白必看:手把手教你用ChatGPT润色Response to reviewer(附中英文模板)
  • 2026年佛山打圈机厂家口碑推荐榜:佛山数控打圈机、佛山空心管打圈机、佛山钢带打圈机、佛山桶箍抱箍卡箍打圈机、佛山弹簧打圈机选择指南 - 海棠依旧大
  • Go语言CatClaw爬虫框架:模块化设计与实战应用解析
  • 企业网络改造实录:用一台H3C防火墙替换老旧路由器,实现固定IP上网+内网DHCP
  • 从零构建个性化AI智能体:基于开源框架的实践指南
  • Next.js实战:构建高性能疫情信息平台的技术架构与工程实践
  • r 看排队,cs 看风暴,nvcswch 看锁,wa 看磁盘,in 看网络 - 小镇
  • containers-from-scratch性能优化:容器启动速度提升的5个关键点
  • YOLOv11改进 | 主干/Backbone篇 | 目标检测网络EfficientNetV1均衡缩放网络改进特征提取层 (适配yolov11全系列N、S、M、L、X)
  • Agent 记忆系统也需要 GC:拆解 Cowork 的 consolidate-memory
  • MiniMax-01系列大模型:超长上下文与多模态能力深度解析与部署指南
  • YOLOv11改进 | 特殊场景检测篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型,全网独家首发改进)
  • ISM波段开关模式功率放大器设计与优化
  • Office激活命令ospp.vbs全解析:从/dstatus到/act,每个参数到底怎么用?(避坑0xC004F074)
  • 大语言模型逻辑推理能力测试与优化方案
  • 告别手动gcc!VSCode配置tasks.json一键编译C/C++多文件项目(含三子棋/扫雷实战)
  • nvcswch - 小镇
  • 基于Next.js 14与Prisma的全栈电商项目实战解析