• 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;
    }
    
  • 相关阅读:
    2018.8.20 Python之路---常用模块
    2018.8.16 正则表达式
    2018.8.15 python中的冒泡法排序
    2018.8.15 python 中的sorted()、filter()、map()函数
    2018.8.14 python中的内置函数(68个)
    2018.8.13 python中生成器和生成器表达式
    2018.8.10 python中的迭代器
    2018.8.9 python中的动态传参与命名空间
    python测试开发django(1)--开始Hello World!
    UPC-5120 Open-Pit Mining(最大权闭合子图)
  • 原文地址:https://www.cnblogs.com/SovietPower/p/10517540.html
Copyright © 2020-2023  润新知