尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

9.22 机房练习

9.22 机房练习
📅 发布时间:2026/6/19 23:47:57

9.22 机房练习

一、 引子

向 myk 大佬学习,养成写练习笔记的好习惯。
还有大约三十多天就复赛了,我的安排是保持每天一两道首银的题目 + 紫书上的题单,前面的是练习有一定难度的题目冲击高分,后面的是系统复习保持手感。
我会尽量不看题解的,但是实在不会真没办法 QAQ。

二、 首银

1. P2602 [ZJOI2010] 数字计数

这道题首先,强硬模拟是不行的,那么思考怎么得到正确答案呢?
我们使用形如 \(\overline{XYZ}\) 表示 \(X \times 100 + Y \times 10 \times Z\)。比如说,对于 \(\overline{1Y}\) 而言,\(1\) 出现了 \(19\) 次,其他数字各出现 \(1\) 次。
那我们能不能基于这个性质,来考虑考虑呢?
假设 \(f[\ x\ ][\ y\ ]\) 表示 \(x\) 位数中 \(y\) 出现了多少次

\[f[\ x\ ][\ y\ ] = f[\ x-1\ ][\ y\ ] \times 9 + 10 ^ { x - 1 } \]

\[\tiny{\red{这个公式是错误的,放在这里仅仅代表思路}} \]

那么对于一个开头一个结尾,我们怎么办呢?
我们举个例子,结尾是 123456789
很容易想到,先直接 DP 到 \(f[\ 8\ ]\),然后从 100000000 开始考虑
第一位都是 \(1\),没有什么参考,进入第二位;
第二位应该是 \(2\),但是 \(2\) 又不是都能取得到啊,不过以 \(1\) 开头是直接加所有的 \(7\) 位数;
第三位应该是 \(3\),同样,\(1\) 和 \(2\) 开头可以加上所有 \(6\) 位数,可是对于 \(3\) 开头的怎么办呢?
先实现简单的部分吧,说不定就想出来了。


那么我实在是想不出来了,只能看看题解怎么说,太菜了。QAQ
其实不考虑 \(0\),\(1\) ~ \(9\) 对于每一位出现的数量是相同的,所以省去第二维状态。

\[f[\ i\ ] = f[\ i-1\ ] \times 10 + 10 ^ { i - 1 } \]

我一直迷着两头处理,但是其实不用。这道题只需要数 \(0\) ~ \(a - 1\) 和 \(0\) ~ \(b\) 的再相减就好了。
考虑答案是 \(ans[\ x\ ]\):
从高位向低位遍历,对于第 \(i\) 位数字为 y,

\[ans[\ x\ ] += f[\ i-1\ ] \times y , x \in [0 , 9] \]

\[ans[\ x\ ] += 10 ^ { i - 1 } , x \in [0 , y - 1] \]

如果 \(x = y\),那么还有: \(ans[\ y\ ] += num + 1\),其中 num 是第 i-1 ~ 1 位的数字,但是 \(ans[\ 0\ ] -= 10 ^ { i - 1 }\)。
最后每一位就是 \(ans_b[x] - ans_{a-1}[x]\)。
代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define int long long 
using namespace std;
const int MAXN=20;
void solve(int,int);
int f[MAXN],fic[MAXN];
int ans[MAXN][2];
int a,b;
signed main(){fic[0]=1;// fic[i] 表示 10 ** i for(int i=1;i<=12;i++){f[i]=f[i-1]*10+fic[i-1];fic[i]=fic[i-1]*10;}cin>>a>>b;solve(a-1,0);solve(b,1);// 尽量不传数组 for(int i=0;i<=9;i++){cout<<ans[i][1]-ans[i][0]<<" ";}return 0;
}
int c[MAXN];// 存储每一位数字 
void solve(int x,int d){// 提取数位 memset(c,0,sizeof(c));int m=0;while(x){c[++m]=x%10;x/=10;}// DPfor(int i=m;i>=1;i--){for(int j=0;j<=9;j++){ans[j][d]+=f[i-1]*c[i];}for(int j=0;j<c[i];j++){ans[j][d]+=fic[i-1];}int num=0;for(int j=i-1;j>=1;j--){num=num*10+c[j];}ans[c[i]][d]+=num+1;ans[0][d]-=fic[i-1];} 
}

相关新闻

  • 视频调色神器!CyberLink ColorDirector:从入门到专业的视频色彩魔法工具
  • P4951 [USACO01OPEN] Earthquake 题解
  • 用ida插件快速审计函数调用

最新新闻

  • Git状态可视化:深入解析Nicolas Gallagher dotfiles的bash提示符系统
  • TPM架构探秘(三):从可信根到主动免疫——TPM 2.0架构下的可信平台构建实践
  • 为什么选择vscode-remote-try-node?Node.js开发容器的10大优势与实际应用案例
  • 3大突破性设计重塑抖音内容生态管理体验
  • FaceFusion 3.6.0终极实战:5大策略实现影视级人脸融合效果
  • CANN/asc-devkit:asc_lt_scalar矢量标量比较函数

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号