【题解】CF468C

传送门


前言

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

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


下面进入主题

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

不难发现,当 n ≤ 1 0 18 n\le10^{18} n1018 时有一个性质:

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+l1f(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=ak1018+ak1f(i)k+(ak)0(moda)

所以可以构造出一组解: l = a − k , r = 1 0 18 + a − k − 1 l=a-k,r=10^{18}+a-k-1 l=ak,r=1018+ak1

于是问题就转化成求出 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+10i=11017f(i)=45×1017+10×(45×1016)+102i=11016f(i)==(18×45)×1017=81×1018

综上, p ≡ 81 × 1 0 18 ( m o d a ) p\equiv81\times10^{18}\pmod{a} p81×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 吧)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值