统计次数【清华大学考研机试题】

统计次数

给定两个正整数 nk,求从 1nn 个正整数的十进制表示中 k 出现的次数。

输入格式
共一行,包含两个整数 nk

输出格式
输出一个整数,表示答案。

数据范围
1n106,
1k9
输入样例:
12 1
输出样例:
5
样例解释
112 这些整数中包含 1 的数字有 1,10,11,12一共出现了 51

暴力 O(nlogn)(174 ms)

具体实现
从 1 遍历到 n,分别统计每个数中 k 出现的次数。
不断取 x 的末尾,判断它是否为 k,再把 x 除以 10(舍弃末位)。

点击查看代码
#include<iostream>

using namespace std;
typedef long long LL;
int n,k;
LL ans;

int main(){
	cin >> n >> k;
	for(int i = 1; i <= n; i ++ ){
		int t = i;
		while(t){
			if(t % 10 == k)ans ++;
			t /= 10;
		}
	}
	cout << ans;
}

数位DP O(n)(62 ms)

f[i] 表示 i 中含有几个 k。观察可得到转移方程 fi=fi/10+(i%10==k),其中 bjj 是否等于 k0j9。如此递推即可

点击查看代码
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
int n,k;
int f[N];
LL ans;

int main(){
	cin >> n >> k;
	for(int i = 1; i <= n; i ++ )f[i] = f[i / 10] +  (i % 10 == k),ans += f[i];
	cout << ans;
}
posted @   Keith-  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示