给定正整数 \(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)\) ,那么有:
同理,\(\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)\) ,那么有
可以这样理解,\(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);
}
原文:https://www.cnblogs.com/wyb-sen/p/15024994.html