P2613有理数取余
P2613 一次同余式+费马小定理
处理输入(字符串)
一次同余式:\(ax≡b(mod p)\)
(1) \(gcd(a,p)=1\),\(b\)任意,唯一解
(2) \(gcd(a,p)=d>1\),\(d\nmid b\),无解
(3) \(gcd(a,p)=d>1,d\mid b\),d个解
这题19260817是质数,可以快速由\(gcd(a,p)=?\),处理掉(2)和(3)
只剩唯一解,\(x ≡ b · a^{-1} (mod p)\),\(a^{-1}\)用快速幂计算(当\(gcd(a,p)=1\)时,有 \(a^{p-2}≡ a^{-1} (mod p)\))
注意:题目是 \(bx≡a\)
上述结论中,\(b=1\)时,
\(ax≡1(mod p)\)
(1) \(a,p\)互质,唯一解
(2) \(a,p\)不互质,无解
题意:
求\(ans=a \times b^{-1}\)
思路:
这题的输入很大,需要用字符串存入,逐位读取,边读边取模
读完之后,得到的整数b(<=mod),可以用费马小定理求逆元
const int mod=19260817;
string a,b;
int ia,ib;
int qpow(int a,int b)
{
int ans=1;
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod;
b>>=1;
}
return ans;
}
int main()
{
cin>>a>>b;
for(char& ch:a){
ia=(ia*10+ch-'0')%mod;
}
for(char& ch:b){
ib=(ib*10+ch-'0')%mod;
}
if(ib%mod==0) cout<<"Angry!";
else{
//gcd(ib,mod)=1,费马小定理求逆元
int inv_b=qpow(ib,mod-2);
cout<<1ll*ia*inv_b%mod;
}
return 0;
}
测试点
输入:
1
1926081700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
输出:
Angry!

浙公网安备 33010602011771号