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

2002NOIP普及组真题 3. 产生数

线上OJ 地址:

【02NOIP普及组】产生数

核心思想:组合数 + dfs + 高精度

1、如果一个数字有 3 位,每位有 2种可能性,则数字的 组合数 为 2*2*2 = 8 种 。故,只要求出每一位数字有多少种变体即可。

求 0 ~ 9 每一个数字的变体数量,可使用dfs深搜,并将结果存储在对应的 c[i] 中
具体方法:对 0 ~ 9 每一个数字执行一次 dfs,统计该数字发生的变体数量(最终要加上自己,比如 2 →3,3 →5,则最终该位置有 3 种数字的变体(分别为3,5和自身2))

2、把输入的字符串转换成 int 数组
3、最终结果 = 每一位变体数量的乘积 。如 2*2*2 = 8 种

由于 n 能达到 1 0 30 10^{30} 1030,所以 n 的位数可达31位,每一位都有 [1 ~ 10] 种变体,所以 10*10*10… *10 就变成了高精度乘法(高精度✖️低精度)。

4、最后注意结果为逆序输出

void Multiply(int a[], int b)  // 高精乘低精 a[] * b 赋值给 a[]。 
{int t = 0, i;   // c存储进位 for(i = 1; i <= a[0]; ++i)  // 注意:a数组存储的是逆序{a[i] = a[i] * b + t;t = a[i] / 10;a[i] %= 10; }while(t > 0)  // 处理最后一次相乘产生的进位{a[i] = t % 10;t /= 10;i++;}while(a[i] == 0 && i > 1)  // 消除 a[] 的前导0 i--;a[0] = i; // a[0]存储 a数组长度 
}
题解代码:
#include<bits/stdc++.h>
using namespace std;const int K = 20;
const int N = 35;int k, cnt = 0, c[10]; 	// 用于存储 0~9 这10个数每个数可以变的次数。举例:1可以变为3和 5,则 c[1]=3;2可以变为6、7、8、9,则c[2]=5
int vis[10]; 	// 用于记录每个数字是否被访问过 
int x[K], y[K];	// 记录每次读进来的规则,举例:第一个规则是 2 →3,则 x[1]=2; y[1]=[3];   第二个规则是 3 →5,则 x[2]=3; y[2]=[5]void dfs(int a)
{for(int i = 1; i <= k; ++i){if(x[i] == a && vis[y[i]] == false){vis[y[i]] = true;cnt++; dfs(y[i]);}}
}void init()
{for(int i = 0; i <= 9; ++i){memset(vis, 0, sizeof(vis));//vis[j]:i能否通过应用某些规则变成数字j cnt = 0;			// cnt 用于记载当前数字可以转变为多少个数字。举例: 2 →3,   3 →5,则表示 2可以转变为 2个数字(3和5),故cnt为2 vis[i] = true;dfs(i);//标记vis 	// 在执行 dfs 时,cnt会不断增加 c[i] = cnt + 1;   	// 加上自身后,存储在该数字对应的数组下标中。举例: 2 →3,   3 →5,则最终该位置有 3 种数字的组合(分别为3,5和自身2) }
}void Multiply(int a[], int b)  // 高精乘低精 a * b 赋值给 a。 
{int t = 0, i;   // c存储进位 for(i = 1; i <= a[0]; ++i){a[i] = a[i] * b + t;t = a[i] / 10;a[i] %= 10; }while(t > 0){a[i] = t % 10;t /= 10;i++;}while(a[i] == 0 && i > 1)  // 消除前导0 i--;a[0] = i; // a[0]存储 a数组长度 
}int main()
{string s; cin >> s >> k;for(int i = 1; i <= k; ++i)   cin >> x[i] >> y[i];// 第一步:对 0~9 每一个数字执行一次 dfs,统计该数字发生的变体数量(最终要加上自己,比如 2 →3,3 →5,则最终该位置有 3 种数字的变体(分别为3,5和自身2)) init();		// 第二步:把输入的字符串转换成int数组	int a[N];			// 用于存储拆分的数字 a[0] = s.length();  // 输入数字的长度 for(int i = 1; i <= a[0]; i++)  a[i] = s[i-1] - '0'; // 第三步:最终结果 = 每一位变体数量的乘积  。如  2*2*2 = 8 种 int f[N];	// f[i]:前i位数字可以变换成的数字种类memset(f, 0, sizeof(f));f[0] = f[1] = 1;for(int i = 1; i <= a[0]; ++i)  Multiply(f, c[a[i]]);  // f * c[a[i]] 赋值回 f for(int i = f[0]; i >=1 ; i--)  cout << f[i];  // 逆序输出      return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • cefsharp124.x升级125.x(cef125.0.21/Chromium 125.0.6422.142)
  • LeetCode-day08-881. 救生艇
  • centos使用docker快速安装nginx
  • Day 25 二叉树的终止
  • kafka如何保证消息不丢失
  • GAT1399协议分析(7)--pycharm anaconde3 配置pyside2
  • 转让北京劳务分包地基基础施工资质条件和流程
  • Vue3 组合式 API:依赖注入(四)
  • bash、zsh、fish三种流行Unix shell的区别
  • Linux 进程控制
  • 为什么选择Python作为AI开发语言
  • Kimichat使用案例010:快速识别出图片中的表格保存到Excel
  • 重邮计算机网络803-(2)物理层
  • AI大模型在健康睡眠监测中的深度融合与实践案例
  • 天诚公租房、人才公寓NB-IOT人脸物联网智能门锁解决方案
  • [PHP内核探索]PHP中的哈希表
  • centos安装java运行环境jdk+tomcat
  • echarts的各种常用效果展示
  • ES学习笔记(12)--Symbol
  • js学习笔记
  • npx命令介绍
  • python学习笔记 - ThreadLocal
  • React的组件模式
  • Spring Boot快速入门(一):Hello Spring Boot
  • TypeScript迭代器
  • Vue.js源码(2):初探List Rendering
  • Web设计流程优化:网页效果图设计新思路
  • 技术:超级实用的电脑小技巧
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 目录与文件属性:编写ls
  • 十年未变!安全,谁之责?(下)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 移动端高清、多屏适配方案
  • (3)选择元素——(17)练习(Exercises)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (TOJ2804)Even? Odd?
  • (办公)springboot配置aop处理请求.
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (蓝桥杯每日一题)love
  • (四)opengl函数加载和错误处理
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (轉貼) UML中文FAQ (OO) (UML)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Core WebAPI中封装Swagger配置
  • .net的socket示例
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [android] 练习PopupWindow实现对话框
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [Codeforces1137D]Cooperative Game
  • [codevs 1515]跳 【解题报告】