CF1992E Novice's Mistake
同步于个人博客。
Problem
Noobish_Monk 有 \(n\in [1,100]\) 个朋友。每个朋友都给了他 \(a\in [1,10000]\) 个苹果作为生日礼物。Noobish_Monk收到礼物后非常高兴,他把 \(b\in[1,\min\{10000,a\cdot n\}]\) 个苹果还给了朋友们。Noobish_Monk 还剩下多少个苹果?"
K1o0n 写了一个解法,但不小心把 \(n\) 的值看成了字符串,所以 \(n \cdot a - b\) 的值的计算方法不同。具体来说
- 当用字符串 \(n\) 乘以整数 \(a\) 时,他将得到字符串 \(s=\underbrace{n + n + \dots + n + n}_{a\ \text{times}}\)。
- 从字符串 \(s\) 中减去整数 \(b\) 时,将删除最后的 \(b\) 个字符。如果 \(b\) 大于或等于字符串 \(s\) 的长度,则字符串将变为空。
现在 ErnKor 想知道在给定的 \(n\) 中,有多少对 \((a, b)\) 满足问题的约束条件且 K1o0n 的解法给出了正确答案。
“解法给出了正确答案”意味着得到了一个非空字符串,且这个字符串转换成整数后等于正确答案,即 \(n \cdot a - b\) 的值。
\(1\le t\le 100,1\le n \le 100\)
Solution
一个粗浅的办法就是,枚举\(a\in[1,1000],b\in[1,\min\{10000,a\cdot n\}]\),使用等比数列求和公式推式子,注意需要对于\(n\)的位数和\(b\)的值分类讨论。
但是由于 \(1\le t\le 100\) ,这个算法是过不去的。我发现答案是非常稀疏的,本来还想试试打表,但是被别人提醒了正解的方向,所以这个想法就搁置下来了(没必要了)。扔一份草稿在附录吧。
正解
我们规定,\(n * a-b\) 是指将 \(n\) 当作字符串重复 \(a\) 次再删去后 \(b\) 位,而 \(n\cdot a-b\) 是指数学意义上的乘法。\(|n|\) 指的是 \(n\) 的位数。
注意到 \(na-b\le 10^6\) ,这意味着 \(n*a-b\) 不能超过 \(6\) 位,也就是 \(1\le |n*a-b|\le6\) ,所以\(|n|\cdot a-6\le b\le |n|\cdot a-1\)。这样我们可以缩小 \(b\) 的枚举范围,只需要枚举 \(6a\) 次即可。
对于每一组 \((a,b)\) ,我们只需生成 \(n*a\) 的前 \(|n|\cdot a-b\) 位,判断其是否与 \(na-b\) 相等,即可做到快速判断 \(n*a-b=na-b\) 是否成立。
Code
vector<pair<int,int>>ans;
int main()
{
int t=1;
cin>>t;
while(t--)
{
LL n;
ans.clear();
cin>>n;
string nn=to_string(n);
for(LL a=1;a<=10000;a++)
{
for(LL b=max(1ll,nn.size()*a-6);b<=nn.size()*a-1;b++)
{
string x;
int wei=nn.size()*a-b;
for(int i=0;i<wei;i++)
{
x.push_back(nn[i%nn.size()]);
}
if(x==to_string(n*a-b)) ans.push_back(make_pair(a,b));
}
}
cout<<ans.size()<<endl;
for(unsigned int i=0;i<ans.size();i++){
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
}
return 0;
}
Appendix
\(|n|=1\)
n * a-b=\frac{n\cdot10^{a-b}-n}9
\end{gather}
\]
\(|n|=2\)
- 若 \(b\) 为偶数:
n * a-b=\frac{n\cdot100^{a-\frac{b}{2}}-1}{99}
\end{gather}
\]
- 若 \(b\) 为奇数:
n * a-b=\frac{n\cdot100^{a-\frac{b+1}{2}}-1}{99}\times 10+[n的十位]
\end{gather}
\]
\(|n|=3\) 即 \(n=100\)
- 若 \(b\equiv 0 \pmod{3}\)
n * a-b=\frac{100\times1000^{a-\frac{b}{3}}-1}{999}
\end{gather}
\]
- \(b\equiv 1 \pmod{3}\)
n * a-b=\frac{100\times1000^{a-\frac{b+2}{3}}-1}{999}\times 100 + 10
\end{gather}
\]
- \(b\equiv 2 \pmod{3}\)
n * a-b=\frac{100\times1000^{a-\frac{b+1}{3}}-1}{999}\times 10+1
\end{gather}
\]
CF1992E Novice's Mistake的更多相关文章
- make no mistake, we are the last line of defense.
make no mistake, we are the last line of defense.
- 动态规划(DP计数):HDU 5121 Just A Mistake
As we all know, Matt is an outstanding contestant in ACM-ICPC. Graph problems are his favorite.Once, ...
- [转] Are You Making a Big Mistake in This Volatile Market?
Stock market volatility continues unabated. It may be too early to tell, but I’m marking the top of ...
- beginner’s mistake
PHP Advanced and Object-Oriented Programming 3rd Edition Related to modularity is abstraction: class ...
- common mistake of closure in loops
[common mistake of closure in loops] 下例中item引用的始终是最后一个值. function showHelp(help) { document.getEleme ...
- Non-Nullable Types vs C#: Fixing the Billion Dollar Mistake (转载)
One of the top suggestions (currently #15 on uservoice) for improving C# is the addition of non-null ...
- Spoken English Practice( Nobody have the guts to tell Paul what a mistake he was taking.(call,come,gut,fortune,when it comes to))
音标复习 绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 口语蜕变(2017/6/24) If your ...
- Null is your firend, not a mistake
原文作者: Roman Elizarov 原文地址: Null is your firend, not a mistake 译者:秉心说 Kotlin Island from Wikimedia by ...
- HDU 5121 Just A Mistake
Just A Mistake Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) ...
- 【pwnable.kr】 mistake
又一道pwnable,我还没放弃.. ssh mistake@pwnable.kr -p2222 (pw:guest) 源代码如下: #include <stdio.h> #include ...
随机推荐
- xss学习及xss-lab解题记录
什么是XSS(跨站脚本攻击) SQL注入是服务端将用户输入的数据当成SQL代码去执行 XSS可以理解为服务端把用户输入的数据当成前端代码去执行 前端代码->主要是js代码 两个关键条件: 第一个 ...
- HarmonyOS_Next 星河版迁移报错记录【自用】
Object literal must correspond to some explicitly declared class or interface (arkts-no-untyped-obj- ...
- 项目管理协作工具对比:PingCode vs Leangoo
多语言适配能力 在全球化协作场景下,多语言支持成为跨国团队的硬性指标.PingCode目前仅支持中文界面,对于涉及多国语言协作的团队存在使用局限.对比Leangoo提供中英文双语界面切换功能,可满足基 ...
- Noise——随机之美
本篇博文介绍图形学中噪音生成的一般方法. Noise可以干什么? 不规则表面生成 有机体模拟 流体烟雾模拟 甚至是使用noise对灯光强度,位置做扰动: 只有我们想象不到的,没有noise不能涉猎的! ...
- Git提交历史优化指南:两步合并本地Commit,代码审查更高效!
在开发过程中,频繁的本地Commit可能导致提交历史冗杂,增加代码审查和维护的复杂度.通过合并连续的Commit,不仅能简化历史记录,还能提升代码可读性和团队协作效率,以下是合并两次本地Commit的 ...
- 【网络】Windows在局域网配置DNS服务器
[网络]Windows在局域网配置DNS服务器 零.需求 最近因为要搭建一个局域网视频聊天系统,需要用到HTTPS协议,HTTPS协议需要证书,证书需要用到域名,而且IP地址不太好记,就想着直接在聊天 ...
- 「硬核实战」回调函数到底是个啥?一文带你从原理到实战彻底掌握C/C++回调函数
大家好,我是小康. 网上讲回调函数的文章不少,但大多浅尝辄止.缺少系统性,更别提实战场景和踩坑指南了.作为一个在生产环境中与回调函数打了多年交道的开发者,今天我想分享一些真正实用的经验,带你揭开回调函 ...
- 最火的 Python 异步 Web 框架的综合对比分析
以下是当前最火的 Python 异步 Web 框架的综合对比分析,涵盖性能.技术特性和适用场景,并补充其他值得关注的框架: 一.主流异步框架横向对比 1. FastAPI • 核心优势:基于 Star ...
- 求水仙花数和敲桌子小游戏(C++版)
求水仙花数 for循环书写水仙花数 #include<iostream> using namespace std; int main() { int num = 0; int a=0, b ...
- javaweb基础之HTTP、Request、Response、ServletContext
一.http协议是一个重要的协议,他是贯穿整合B/S架构的核心协议.因此学习http协议的时候一定要从请求和响应两个角度思考.注意方向性(请求:浏览器->服务器:响应:服务器->浏览器) ...