CF468C 【Hack it!】
2024-09-06 08:20:26
构造题果然都非常神仙啊
首先翻译有点问题,\(L, R\)的范围应该为\([1, 10^{200}]\)
由于模数a达到了\(10^{18}\),所以我们可以发现,当\(i<10^{18}\)时,\(f()\)有一个性质:
\[f(i+10^{18}) = f(i)+1
\]
\]
我们令\(g=\sum_{i=1}^{10^{18}}f(i)\ (mod\ a)\)
于是我们有:\(g+1=\sum_{i=2}^{10^{18}+1}f(i)\ (mod\ a)\)
\(g+a-g=\sum_{i=a-g+1}^{10^{18}+a-g}f(i)\ (mod\ a)=0\ (mod\ a)\)
所以我们可以构造出一组解为\([a-g, 10^{18}+a-g+1]\)
于是我们现在问题就变成了求出\(g\)
\(g=\sum_{i=1}^{10^{18}-1}f(i)+1\)
对于\(10^{18}-1\)的所有数位出现次数都是一样长的
所以答案应该为\(45*\)每一个数位出现多少次
这个东西就可以用数位DP组合数来求了:我们把原问题想象成:有18个空位,你可以放\([0, 9]\)中的所有数,问\(i\)放了多少次
\[ans=\sum_{i=1}^{18}C_{18}^i*9^{18-i}
\]
\]
然后用\(__int128\)跑一下,答案为\(45*18*10^{17}+1=81*10^{18}+1\)
\(Code:\)
#include<bits/stdc++.h>
using namespace std;
long long a, pax = 1e18 + 1;
signed main() {
cin >> a;
long long l = a - pax % a * 9 % a * 9 % a, r = pax + l - 1;
printf("%lld %lld", l, r);
return 0;
}
最新文章
- Ref 与 Out 的使用方法及区别
- web前端编写注意点
- BabeLua
- Disable Portrait in app
- GDB技巧整理
- javascript代码放置位置对程序的影响
- BestCoder Round #20 部分题解(A,B,C)(hdu5123,5124,5125)
- [Unity-7] Update和FixedUpdate
- Android中的ScrollTo和ScrollBy解析
- Loadrunner web_url函数学习(转贴)
- ASP.NET MVC中错误处理方式
- Django访问量和页面点击数统计
- ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)
- MFC 解决中文乱码问题
- <;iOS开发>;之App上架流程(2017)
- Spring4之IOC
- python 参数解析ArgumentParser
- FastDFS配置 ***
- 04 Spring的@Autowired注解、@Resource注解、@Service注解
- [转]wget 下载整个网站,或者特定目录