http://codeforces.com/problemset/problem/468/C
设 (f(x)) 为 (x) 的十进制下各个位上数字之和,给定 (a(ale 10^{18})),求 (l,r(lle rle 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+1pmod a)
不断通过这种变换,就可以得到:
[sum_{i=k}^{inf+k-1}equiv p+kpmod a
]
当 (k=a-p) 时,有:
[sum_{i=a-p}^{inf+a-p-1}equiv 0pmod a
]
则 (l=a-p,r=inf+a-p+1) 即为一组解
那么剩下的问题就是求出 (p),考虑最高位,也就是第 (18) 位,它取一到九之间的任意一个数,分别存在 (10^{17}) 种方案,那么这一位对答案的贡献就是 (45 imes 10^{17})
在考虑剩下的 (17) 位,就是一共 (10) 个 (sum_{i=0}^{10^{17}-1}f(i)),这样就有了一个比较像递归的解决方法:
[sum_{i=0}^{10^{18}-1}f(i)
]
[45 imes 10^{17}+10sum_{i=0}^{10^{17}-1}f(i)
]
[45 imes 10^{17}+450 imes 10^{16}+100sum_{i=0}^{10^{16}-1}f(i)
]
[cdots
]
最终结果:
[45 imes 18 imes10^{17}=81cdot 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);
}