前言
这真的是我见过的代码最短的紫题了!
但是正解并不好想,构造过程很奇特。
下面进入主题
我们设 f ( n ) f(n) f(n) 表示自然数 n n n 的数字和。
不难发现,当 n ≤ 1 0 18 n\le10^{18} n≤1018 时有一个性质:
f ( n + 1 0 18 ) = f ( n ) + 1 \boxed{f(n + 10^{18})=f(n)+1} f(n+1018)=f(n)+1
设 ∑ i = 1 1 0 18 f ( i ) = k \sum_{i=1}^{10^{18}}f(i)=k ∑i=11018f(i)=k
则:
∑ i = 2 1 0 18 + 1 f ( i ) = f ( 1 0 18 + 1 ) − f ( 1 ) + ∑ i = 1 1 0 18 f ( i ) = f ( 1 0 18 ) + f ( 1 ) − f ( 1 ) + ∑ i = 1 1 0 18 f ( i ) = 1 + ∑ i = 1 1 0 18 f ( i ) ≡ k + 1 ( m o d a ) \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} ∑i=21018+1f(i)=f(1018+1)−f(1)+∑i=11018f(i)=f(1018)+f(1)−f(1)+∑i=11018f(i)=1+∑i=11018f(i)≡k+1(moda)
同理可得
∑ i = 3 1 0 18 + 2 f ( i ) ≡ k + 2 ( m o d a ) \sum_{i=3}^{10^{18}+2}f(i)\equiv k+2\pmod{a} ∑i=31018+2f(i)≡k+2(moda)
… … …… ……
∑ i = l 1 0 18 + l − 1 f ( i ) ≡ k + l ( m o d a ) \sum_{i=l}^{10^{18}+l-1}f(i)\equiv k+l\pmod{a} ∑i=l1018+l−1f(i)≡k+l(moda)
可以构造出:
∑ i = a − k 1 0 18 + a − k − 1 f ( i ) ≡ k + ( a − k ) ≡ 0 ( m o d a ) \sum_{i=a-k}^{10^{18}+a-k-1}f(i)\equiv k+(a-k)\equiv0\pmod{a} ∑i=a−k1018+a−k−1f(i)≡k+(a−k)≡0(moda)
所以可以构造出一组解: l = a − k , r = 1 0 18 + a − k − 1 l=a-k,r=10^{18}+a-k-1 l=a−k,r=1018+a−k−1
于是问题就转化成求出 k k k。
k = ∑ i = 1 1 0 18 f ( i ) = 45 × 1 0 17 + 10 ∑ i = 1 1 0 17 f ( i ) = 45 × 1 0 17 + 10 × ( 45 × 1 0 16 ) + 1 0 2 ∑ i = 1 1 0 16 f ( i ) = … … = ( 18 × 45 ) × 1 0 17 = 81 × 1 0 18 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} k=∑i=11018f(i)=45×1017+10∑i=11017f(i)=45×1017+10×(45×1016)+102∑i=11016f(i)=……=(18×45)×1017=81×1018
综上, p ≡ 81 × 1 0 18 ( m o d a ) p\equiv81\times10^{18}\pmod{a} p≡81×1018(moda)
温馨提示:记得开 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 吧)。