zoukankan      html  css  js  c++  java
  • CF468C Hack it!F

    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);
    }
    
  • 相关阅读:
    AT+CNMI的使用
    oracle 触发器及游标的使用
    索引优缺点
    SQL Server里的主键、唯一性约束、聚集索引
    C++中使用内存映射文件处理大文件
    oracle 学习笔记
    香干炒肉丝
    如何将数据导入到 SQL Server Compact Edition 数据库中
    解决ORACLE密码遗忘
    Office 2003 主 Interop 程序集的安装和使用
  • 原文地址:https://www.cnblogs.com/suxxsfe/p/13599234.html
Copyright © 2011-2022 走看看