Codeforces.468C.Hack it!(构造)

题目链接

(dls)出的比赛诶...这么妙。


(Description)

(f(x))表示整数(x)在十进制下各个数位的数字之和。给定(a),求两个整数(l,r),使得(sum_{i=l}^rf(i)equiv0 (mathbb{mod} a))
(1leq aleq10^{18}, 1leq lleq rleq10^{200}),保证存在解。

(Solution)

考虑一个简单的性质:(f(x+10^y)=f(x)+1, xlt10^y)
不妨令(INF=10^{18}),设(sumlimits_{i=0}^{INF-1}f(i)equiv p (mathbb{mod} a))
由上面的性质可知,(sumlimits_{i=1}^{INF}f(i)=p-f(0)+f(INF)=p+1)
同理还有:(sumlimits_{i=2}^{INF+1}f(i)=p+2... sumlimits_{i=k}^{INF+k-1}f(i)=p+k)(都是模(a)意义下)。
然后就可以构造出(a=p+a-p=sumlimits_{i=a-p}^{INF+a-p-1}f(i))。所以令(l=a-p, r=10^{18}+a-p-1)就可以啦。
有个问题是求(sum_{i=0}^{10^{18}-1}f(i) mathbb{mod} a)。展开一下:$$egin{aligned}sum_{i=0}^{10^{18}-1}f(i)&=(1+2+...+9)10^{17}+10 imessum_{i=0}^{10^{17}-1}f(i)&=45 imes10^{17}+10(45 imes10^{16}+10 imessum_{i=0}^{10^{15}-1}f(i))&=...&=18 imes45 imes10^{17}=81 imes10^{18}end{aligned}$$

这样就做完啦。

还有个做法是,考虑有(sumlimits_{i=1+x}^{10^y+x}f(i)-sumlimits_{i=1}^{10^y}f(i)=x, xlt10^y)。枚举(y),如果有(a-sumlimits_{i=0}^{10^y}<10^y),令(x)等于这个数,就有(sumlimits_{i=1+x}^{10^y+x}f(i)=sumlimits_{i=0}^{10^y}+a-sumlimits_{i=0}^{10^y}=a)了。
需要预处理一下(sum_{i=1}^{10^y}f(i)),因为是上限(10)的幂所以算一下每个数出现次数即可(或者像上面一样直接算)。


#include <cstdio>
typedef long long LL;
const LL INF=1e18;

int main()
{
	LL a; scanf("%I64d",&a);
	LL l=a-INF*9%a*9%a;
	printf("%I64d %I64d
",l,INF+l-1);

	return 0;
}
原文地址:https://www.cnblogs.com/SovietPower/p/10517540.html