洛谷 P2613 【模板】有理数取余(高精度取余,逆元)
传送门
解题思路
其实很简单,先考虑什么时候无解:
当分母b是模数p的倍数时。
当b不是p的倍数时,又因为p是个大质数,所以可以直接费马小定理求逆元。
但是a和b很大,所以我们可以先把a和b取模,然后求a乘上b的逆元就行了。
\[ans=a\times b^{-1}\pmod p
\]
高精度取余在写了这个题后就感觉杀鸡一样
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int mod=19260817;
string s1,s2;
long long a1,a2;
int len1,len2;
long long kp(long long a,int b){
if(b==1) return a;
long long res=kp(a,b/2);
return (b&1)?res*res%mod*a%mod:res*res%mod;
}
int main(){
cin>>s1>>s2;
len1=s1.length();
len2=s2.length();
for(int i=0;i<len1;i++){
a1=a1*10+s1[i]-'0';
a1%=mod;
}
for(int i=0;i<len2;i++){
a2=a2*10+s2[i]-'0';
a2%=mod;
}
if(a2==0){
cout<<"Angry!"<<endl;
return 0;
}
if(a1==0){
cout<<0<<endl;
return 0;
}
cout<<a1*kp(a2,mod-2)%mod;
return 0;
}