洛谷 P4942 小凯的数字(数论,逆元)
传送门
解题思路
因为可以大整数分解为l*10k+(l+1)*10k-1+(l+2)*10k-3+……+r*100,而10k%9=1,所以原整数在模9意义下等于l+(l+1)+(l+2)+(l+3)+……+r=(l+r)*(r-l+1)/2。
因为有除法,所以我们算出2在%9意义下的逆元为5,即可解决问题。
逆元不会求咋办?当场退役。
不!洛谷大佬告诉我们:
当要除的数非常小的时候,我们可以直接把要取模的数扩大相应的倍数,正常除就行了。最后再对答案取模。
即
ans = (l+r)%18*(r-l+1)%18/2%9;
AC代码
1 #include<iostream> 2 using namespace std; 3 int q; 4 long long l,r; 5 int main(){ 6 cin>>q; 7 for(int i=1;i<=q;i++){ 8 cin>>l>>r; 9 cout<<(l%9+r%9)*((r-l+1)%9)*5%9<<endl; 10 } 11 return 0; 12 }