CF468C Hack it!(构造,数学)
洛谷传送门
解题思路
方法一:
发现l和r特别大,但是a特别小。
于是令 \(l=0,r=10^{100}-1\),算出一个sum。
然后发现若l和r同时加上一个数x,最后的sum也加上了x。
所以只要我们算出原来的sum与a的差,然后l和r同时加上这个差就完成了。
sum怎么算?
0~9每个数字出现的频率是相同的,一共 \(10^{100}\times 100\) 个数字,所以平均每个数字的出现次数为 \(10^{101}\)。
所以最后的sum就是 \(0\times10^{101}+1\times10^{101}+\cdots+9\times10^{101}=45\times10^{101}\)
方法二:
r的范围可以进一步缩小,不必从10100-1开始,可以直接从1018-1算起。
也不用快速幂等,可以写个数位dp求,也可以直接手推。
sum为 \(81\times10^{18}\)。
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
const long long maxx=1e18;
long long a,res;
int main(){
ios::sync_with_stdio(false);
cin>>a;
res=a-9*maxx%a*9%a;
cout<<res<<" "<<maxx+res-1<<endl;
return 0;
}