【CF468C】Hack it!
阿新 • • 發佈:2021-06-22
題目
題目連結:https://codeforces.com/problemset/problem/468/C
給定正整數 \(n\),記 \(f(i)\) 表示 \(i\) 各位數字之和,求滿足 \(1\leq l\leq r\leq 10^{200}\) 的數 \(l,r\),使得
\(n\leq 10^{18}\)。
思路
對於 \(<10^{18}\) 的任意數字 \(x\),顯然有 \(f(x)+1=f(x+10^{18})\)。
我們先設 \(l=1,r=10^{18}\),記此時 \(\left(\sum^{r}_{i=l}f(i)\right)\bmod n=x\)
所以我們只需要不斷增加 \(l,r\),使得 \(x=n\) 即可。
問題轉化為求 \(\left(\sum^{10^{18}}_{i=1}f(i)\right)\bmod n\) 的值,先把 \(10^{18}\) 扔掉,考慮 \(1\sim 10^{18}-1\) 的每一位,不難發現對於每一位,每一個數字出現的次數恰好是 \(10^{17}\) 次。
所以 \(\sum^{10^{18}-1}_{i=1}f(i)=45\times 10^{17}\times 18=81\times 10^{18}\)。在加上 \(f(10^{18})=1\)
然後就可以輕鬆構造出合法的區間了。
程式碼
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
int main()
{
scanf("%I64d",&n);
m=n-9000000000000000000LL%n*9LL%n;
cout<<m<<" "<<999999999999999999LL+m;
return 0;
}