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} imes 100) 个数字,所以平均每个数字的出现次数为 (10^{101})
所以最后的sum就是 (0 imes10^{101}+1 imes10^{101}+cdots+9 imes10^{101}=45 imes10^{101})


方法二:

r的范围可以进一步缩小,不必从10100-1开始,可以直接从1018-1算起。
也不用快速幂等,可以写个数位dp求,也可以直接手推。
sum为 (81 imes10^{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;
}