1. 程式人生 > 其它 >CF468C Hack it 題解

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);
}