CF468C Hack it 题解

CF468C Hack it

题面

给定正整数 \(n\),求一组 \((l,r)\),使得 \(l\)\(r\) 内所有整数的数位和的和是 \(n\) 的倍数。\(n<=10^{18}\)

分析

\(f(i)\) 表示 \(i\) 的数位和

则显然有:\(f(i+10^{18})=f(i)+1\)

不妨设 \(\sum_{i=1}^{10^{18}-1}f(i)\equiv p (\bmod a)\) ,那么有:

\[\begin{align*} \sum_{i=1}^{10^{18}}&=f(10^{18}+0)+\sum_{i=1}^{10^{18}-1}f(i) \&=1+f(0)+p\&\equiv p+1 (\bmod a) \end{align*} \]

同理,\(\sum_{i=2}^{10^{18}+1}=f(10^{18}+1)+\sum_{i=1}^{10^{18}}f(i)-f(1)\equiv p+2(\bmod a)\)

可知 \(\sum_{i=x}^{10^{18}+x-1}\equiv p+x(\bmod a)\)

那么有:

\(\sum_{i=a-p}^{10^{18}+a-p-1}\equiv p+a-p \equiv 0(\bmod a)\)

所以 \(l=a-p ,r=a-p-1\)

现在的问题是如何快速地求到 \(p\)

设函数 \(F(x)=\sum_{i=0}^{10^x-1}f(i)\) ,那么有

\[\begin{equation} F(x)= \left\{ \begin{array}{lr} 45,&(x=1)\ 45\times10^{x-1}+10\times F(x-1),&(x>1) \end{array} \right. \end{equation} \]

可以这样理解,\(45=1+2+3+\dots+8+9\) 是对于首位枚举

而后面的数位和不变,算上本身有需要加 \(10\)

最后化简得到:\(F(18)=9\times9\times10^{18}\)

代码

#include<cstdio>
typedef long long LL;
LL l,r,inf=1e18,mod;
int main(){
    scanf("%lld",&mod);
    l=mod-inf%mod*9%mod*9%mod;
    r=l+inf-1;
    printf("%lld %lld\n",l,r);
}

CF468C Hack it 题解

上一篇:left join产生重复数据


下一篇:MFC无边框窗体不响应任务栏点击问题