题解:qoj1875 Nein

news/2025/10/28 23:04:09/文章来源:https://www.cnblogs.com/LUlululu1616/p/19172913

题意:给出 \(k,n\),问第 \(n\) 个是 \(10^k-1\) 的倍数的且每个数字不含有 \(9\) 的数是多少。\(k\le 18,n\le 10^{18}\)

做法:

首先先跳出一个很显然的想法,一开始看这个东西觉得应该是拆成 \(x10^k-x\) 去讨论,但是显然有点完蛋。所以考虑去对 \(x(10^k-1)\) 直接枚举去计算。

我们猜答案位数不会太大,取大概 \(20+\) 位即可。

那么现在考虑类似数位 dp,每次枚举还没确定的最高位是多少然后去看有多少个数满足。因为是 \(10^k-1\) 的倍数的条件是 \(k\) 位一段,段和加起来是其倍数,所以我们考虑直接把 \(\bmod k\) 相等的位全部加在一起,也就是把 \(10^x\) 的位权变成 \(10^{x\bmod k}\)。但是有个比较麻烦的是我们需要同时在十进制和 \(10^k-1\) 的倍数这个限制考虑,因为答案位数不大,所以其实我们可以直接枚举加和是多少倍的 \(10^k-1\),我们就可以求出来我们最后需要每个十进制位上是多少。

然后考虑 dp,从低位往高位 dp,\(dp_{i,j}\) 代表考虑到了第 \(i\) 位,目前被进了 \(j\) 位到第 \(i\) 位上。因为我们确定了总位数,所以可以知道有多少个数会贡献在 \(i\) 这一位,转移直接枚举他们的总和,再计算进位个数就可以转移,记得需要满足我枚举的数的十进制位要求。注意到这个东西和是第多少位没啥关系,所以我们可以提前处理出来 \(f_{i,j}\) 代表 \(i\)\([0,8]\) 的数和为 \(j\) 的方案数。

然后就做完了,感觉这个题的唯一脑筋急转弯在于枚举 \(x\times (10^k-1)\)

输出就是做一个高精除就可以了。

代码实现上,我 dp 为了方便用的是记忆化写法,记得多开点 __int128,这个题到处都会爆 long long

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 55, B = 20;
__int128 dp[maxn][maxn * maxn];
int n, k, t, a[maxn];
__int128 f[maxn][maxn * maxn], all, tc;
int lim[maxn * maxn], vis[maxn][maxn * maxn], ad[maxn * maxn], to[maxn * maxn], ed;
__int128 cal(int x, int add) {if(x >= ed)return (add == 0);if(vis[x][add])return f[x][add];vis[x][add] = 1, f[x][add] = 0;for (int i = (to[x] - (ad[x] + add) % 10 + 10) % 10; i + ad[x] + add <= 54 * 8; i += 10)if(dp[lim[x]][i])f[x][add] = (f[x][add] + cal(x + 1, (i + ad[x] + add) / 10) * dp[lim[x]][i]);
//	if(ed == 2 && a[3] == 1)
//		cout << x << " zcmvsabviwqu" << add + ad[x] << " " << (int)f[x][add] << endl;return f[x][add];
}
void solve(int x) {all = 0;for (__int128 nw = 1; nw <= ((B) / k + 2); nw++) {ed = 0;__int128 tmp = nw * tc;while(tmp) {to[ed++] = tmp % 10;tmp /= 10;}for (int i = 0; i < k; i++)lim[i] = 0, ad[i] = 0;for (int i = 0; i < (B / k + 2) * k; i++)lim[i % k]++;for (int i = (B / k + 2) * k - 1; i >= x; i--) {lim[i % k]--;//	if(nw <= 2)//	cout << i << " " << (int)(all) << endl;ad[i % k] += a[i];}
//		cout << (int)(all) << " " << (int)nw << endl;memset(vis, 0, sizeof(vis));all += cal(0, 0);}
}
void write(__int128 x) {if(x <= 9) {putchar(x + '0');return ;}write(x / 10);putchar(x % 10 + '0');
}
signed main() {cin >> k >> n;dp[0][0] = 1;for (int i = 1; i <= 54; i++)for (int j = 0; j <= 8; j++)for (int k = j; k <= i * 8; k++)dp[i][k] = (dp[i][k] + dp[i - 1][k - j]);
//	for (int i = 3; i <= 3; i++)
//		for (int j = 0; j <= 9; j++)
//			cout << i << " " << j << " " << (int)dp[i][j] << endl;tc = 1;for (int i = 1; i <= k; i++)tc = tc * 10;tc--;
//	cout << (int)dp[23][0] << endl;for (int i = (B / k + 2) * k - 1; i >= 0; i--) {while(1) {solve(i);//	cout << a[i] << " " << (int)all << endl;if(all >= n)break;n -= all;a[i]++;}}__int128 s = 0;for (int i = (B / k + 2) * k - 1, nw = 0; i >= 0; i--) {s = s * 10 + a[i];if(s >= tc)nw = 1;if(nw || s >= tc)cout << (int)(s / tc);s %= tc;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息(摘)

一、map组件基础使用<template><view class="contact"><image class="img" :src="formData.headImg"></image><view class="info"><view @…

.NET开发上手Microsoft Agent Framework(一)从开发一个AI美女聊天群组开始

前言 在AI快速发展的今天,微软推出了多个AI开发框架,从早期的AutoGen到Semantic Kernel,再到最新的Microsoft Agent Framework。很多开发者可能会有疑问:为什么微软要推出这么多框架?它们之间有什么区别?本文将通…

10/28

10/28今天在工程实训里学习了金属工艺加工,学习了java的相关网课

大学四年的学费/生活费自足攻略

1997年夏天带着通过亲戚朋友筹集的学费4000元踏上了北上兰州的旅程。我独自一人第一次穿越3000公里来到兰州,办好入学手续住进宿舍。虽然没有政和的老乡,但是有几位南平的老乡来找我,特别是建瓯话和政和话是一样的,…

175天 隧道技术篇防火墙组策略FRPNPSChiselSocks代理端口映射C2上线

三种工具 frp/NPS/Chisel 不用过多的纠结去使用哪一款工具 frp的C2上线 解决的问题: 1.C2上线 2.实现信息收集(两个) 这边可以使用CS生成一个47.xx.xx.xx的后门,然后搭建frp后,进行上线 下面相当于是把端口映射出…

10.28每日总结

今天的主要课程有人机交互技术,软件构造,软件企业文化。完成了上周机器学习的作业以及企业文化的报告,软考准备开始专精刷题里,加油!

102302126李坤铭作业1

作业1 用requests和BeautifulSoup库方法定向爬取给定网址(http://www.shanghairanking.cn/rankings/bcur/2020 )的数据,屏幕打印爬取的大学排名信息。 1)代码: 点击查看代码 import requests from bs4 import Bea…

10月28日日记

1.今天进行工程实训 2.明天学习马哲 3.负载因子为什么通常设置为0.75?

【大模型应用开发】之本地部署大模型

本地部署本地部署一般是在自己的服务器上部署,但这里以本地电脑进行部署为例,由于电脑配置远远无法支持大模型配置要求,届时部署下来的也是阉割版的。本地部署一种方案就是ollama,官方地址:https://ollama.com访问…

link元素的用法及HTML样板

本人学习时候很容易额外扩展,因为很多次见到同一个熟悉但不了解的代码或用法我会很难受,所以我把基本用法都列出来了,看起来会很冗杂(因为不仅不同文章重复,相同文章我也在重复-.-),但结合实例来回对比查阅让我…

Raft 一致性算法简介

引言与背景 分布式系统中,为了在 非拜占庭故障(如节点宕机或网络分区)情况下保持数据一致性,往往需要分布式共识算法来确保多个副本状态统一 。长期以来,Leslie Lamport 提出的 Paxos 算法 一直是这一领域的代表…

10月28号

今天上午进行了铁道认知实训

URL验证绕过速查表:全面解析SSRF与CORS绕过技术

本文详细介绍了PortSwigger最新发布的URL验证绕过速查表工具,涵盖域名混淆、伪相对URL、环回地址编码等核心技术,帮助安全测试人员快速生成绕过payload,有效检测SSRF、CORS配置错误等漏洞。介绍URL验证绕过速查表 U…

https://avoid.overfit.cn/post/44c8d547475340d59aa4480f634ea67f

现在的 Agent 系统有个很明显的问题 —— 会话一结束,什么都忘了。 这不是个技术缺陷,但是却限制了整个系统的能力边界。Agent 可以做推理、规划、执行复杂任务,但就是记不住之前发生过什么。每次对话都像是第一次见…

23题黄金分割

某同学在学习了黄金分割后对于黄金分割产生了浓厚的兴趣,于是他开始探究有关黄金分割的相关性质,请你帮助他完成以下任务。【任务一】作一个黄金分割 (1)如图, \(BC \perp AB\), \(BC = \frac{1}{2} AB\),作 \(…

记录一次成功的springboot2

pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"x…

算法学习-素数筛法【埃氏筛法、线性筛法】

普通筛法: 核心思路: 使用一个布尔数组记录此数是否为素数, 从2~n便利, 如果是此数记录为素数 向后维护数组,此素数的K倍均为非素数,直到大于n. ^时间复杂度O(nlogn) 便利+维护 埃式筛法 初式: 同线性筛法,依次遍历向后…

日总结 19

C#是基于.NET框架的托管语言,由CLR(公共语言运行时)负责自动内存管理(垃圾回收),开发效率高,更适合快速构建Windows应用、Web服务、Unity游戏等上层应用,编译后生成中间语言(IL),跨平台依赖.NET Core/5+;而…

Day 18

复习日:把散落的知识点,织成可落地的网 原本计划学新内容,可翻了翻最近的笔记,发现二叉树遍历、MySQL查询、离散图论的知识点像散落在抽屉里的零件——单独看都认识,凑到一起却不知道怎么联动。索性花一天时间复盘…