suxxsfe

一言(ヒトコト)

CF468C Hack it!F

http://codeforces.com/problemset/problem/468/C
\(f(x)\)\(x\) 的十进制下各个位上数字之和,给定 \(a(a\le 10^{18})\),求 \(l,r(l\le r\le 10^{200})\),使得:

\[\sum_{i=l}^{r} f(i)\equiv 0 \pmod a \]


这题是真的真的真的妙哇

\(inf=10^{18}\),也就是 \(a\) 的最大值
显然有:\(f(i+10^x)=f(i)+1,10^x>i\)
设一个 \(p\),使得 \(\sum_{i=0}^{inf-1}f(i)\equiv p \pmod a\)
那么根据上面那个式子,可以知道 \(\sum_{i=1}^{inf}f(i)\equiv p-f(0)+f(0+inf)\equiv p+1\pmod a\)
不断通过这种变换,就可以得到:

\[\sum_{i=k}^{inf+k-1}\equiv p+k\pmod a \]

\(k=a-p\) 时,有:

\[\sum_{i=a-p}^{inf+a-p-1}\equiv 0\pmod a \]

\(l=a-p,r=inf+a-p+1\) 即为一组解

那么剩下的问题就是求出 \(p\),考虑最高位,也就是第 \(18\) 位,它取一到九之间的任意一个数,分别存在 \(10^{17}\) 种方案,那么这一位对答案的贡献就是 \(45\times 10^{17}\)
在考虑剩下的 \(17\) 位,就是一共 \(10\)\(\sum_{i=0}^{10^{17}-1}f(i)\),这样就有了一个比较像递归的解决方法:

\[\sum_{i=0}^{10^{18}-1}f(i) \]

\[45\times 10^{17}+10\sum_{i=0}^{10^{17}-1}f(i) \]

\[45\times 10^{17}+450\times 10^{16}+100\sum_{i=0}^{10^{16}-1}f(i) \]

\[\cdots \]

最终结果:

\[45\times 18\times10^{17}=81\cdot inf \]

于是就做完了((
但是注意处理 \(r\) 的时候,用 \(inf+l-1\) 来算,不能取膜,否则可能造成 \(l>r\) 的情况
另外不能直接乘 \(81\),乘两个 \(9\) 来代替,否则爆 long long

#include<cstdio>
int main(){
	long long a,inf=1e18;
	scanf("%lld",&a);
	long long l=a-(inf%a*9%a*9%a);//防止溢出,有个点就卡这个
	long long r=l+inf-1;
	printf("%lld %lld",l,r);
}
posted @ 2020-09-01 22:39  suxxsfe  阅读(157)  评论(0编辑  收藏  举报