【题解】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 吧)。