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);
}