头像

欢迎来到我的博客

分享题解与总结

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!
posted @ 2026-06-24 21:58  king_steph1209  阅读(12)  评论(0)    收藏  举报