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;
}
posted @ 2021-09-23 09:44  尹昱钦  阅读(44)  评论(0编辑  收藏  举报