洛谷 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;
}
posted @ 2021-06-04 18:56  尹昱钦  阅读(190)  评论(0编辑  收藏  举报