【题解】CF468C

传送门


前言

这真的是我见过的代码最短的紫题了!

但是正解并不好想,构造过程很奇特。


下面进入主题

我们设 \(f(n)\) 表示自然数 \(n\) 的数字和。

不难发现,当 \(n\le10^{18}\) 时有一个性质:

\(\boxed{f(n + 10^{18})=f(n)+1}\)

\(\sum_{i=1}^{10^{18}}f(i)=k\)

则:

\(\sum_{i=2}^{10^{18}+1}f(i)=f(10^{18}+1)-f(1)+\sum_{i=1}^{10^{18}}f(i)=f(10^{18})+f(1)-f(1)+\sum_{i=1}^{10^{18}}f(i)=1+\sum_{i=1}^{10^{18}}f(i)\equiv k+1\pmod{a}\)

同理可得

\(\sum_{i=3}^{10^{18}+2}f(i)\equiv k+2\pmod{a}\)

\(……\)

\(\sum_{i=l}^{10^{18}+l-1}f(i)\equiv k+l\pmod{a}\)

可以构造出:

\(\sum_{i=a-k}^{10^{18}+a-k-1}f(i)\equiv k+(a-k)\equiv0\pmod{a}\)

所以可以构造出一组解:\(l=a-k,r=10^{18}+a-k-1\)

于是问题就转化成求出 \(k\)

\(k=\sum_{i=1}^{10^{18}}f(i)=45\times10^{17}+10\sum_{i=1}^{10^{17}}f(i)=45\times10^{17}+10\times(45\times10^{16})+10^2\sum_{i=1}^{10^{16}}f(i)=……=(18\times45)\times10^{17}=81\times10^{18}\)

综上,\(p\equiv81\times10^{18}\pmod{a}\)

温馨提示:记得开 long long!

代码

#include <iostream>
#include <cstdio>
#define int long long
using namespace std;

int a, x = 1e18, l, r;

signed main()
{
	scanf("%lld", &a);
	l = a - x % a * 9 % a * 9 % a;
	r = x + l - 1;
	printf("%lld %lld", l, r);
	return 0;
}

然后你测样例就会发现 WA 了

???

不要急,直接交就会发现 AC 了(应该是 spj 吧)。

posted @ 2021-08-07 17:47  mango09  阅读(60)  评论(0编辑  收藏  举报
-->