Carryon 数数字(x^n ≡1 mod(x-1))

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目链接:https://code.mi.com/problem/list/view?id=138&cid=7

题目
Carryon 最近迷上了数数字,然后 Starry 给了他一个区间 [l, r],然后提了几个要求,

需要将 l 到 r 之间的数全部转化成 16 进制,然后连起来。
将连起来的数又转化成 10 进制。
将最终结果对 15 取模。
数据范围:1<=l<=r<=1000000000000
10、11、12、13、14的16进制分别是a、b、c、d、e。依次连在一起是abcde,转换成10进制是703710,对15取模为0。
----------------
不知到为啥
10*16^4 + 11*16^3 + 12*16^2 + 11*16^1 + 10 mod 15
==>
10 + 11 + 12 + 13 + 14  mod 15

如: 
10*16^4 = 10+10*(16^4-1)
==> 10%15 + 10*(16^4-1)%15
==> 10 + 0 
x^n ≡ 1 mod(x-1)  
故(x^n)-1 ≡ 0 mod(x-1)

证:  x^n ≡ 1 mod(x-1)
	 x^n mod (x-1)
==>  x^(n-1)*(x-1) + x^(n-1) mod (x-1) 
==>  ...
==>  x^0 mod (x-1)
==>  1 mod (x-1)
从L加到R,结果mod15
#include
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
ll L,R;
int main(){
	cin>>L>>R;
	ll ans=0;
	for(ll i=L; i<=R; i++){
		ans += i%15;
		if(ans>=15)ans-=15;
		if(i%15==0){ // 这些加起来%15=0 
			i += (R-i)/15 *15;
		}
	} 
	cout<<ans; 
	return 0;
} 

你可能感兴趣的:(模拟)