洛谷p2613【模板】有理數取餘

題目ios

\(c\)等於一個分數,求他的餘數,分數是不能直接模的,除以一個數等於乘上這個數的逆元。git

因此此題就是求一個逆元,費馬小定理求逆元是很方便的,一個快速冪就解決了。spa

還要注意由於\(a,b\)的值都很大,在讀入的時候須要取模code

可是這樣只能拿到\(90\)分,最後一個點過不了,什麼緣由?咱們尚未判斷這個\(b\)是否有逆元,判斷這個數是否有逆元的方法,也不難,只需判斷\(gcd(b, mod)\)是否爲\(1\)便可。get

話說我本身寫過博客的我都忘了,作題的時候回來看的\(233\)博客

貌似博客裏寫的東西還出鍋了,又被\(lfd\)一頓嘲笑。\(233\)(卑微.jpgit

他講的數論我當時確實是聽得很明白啊,但是後來又忘了......io

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 19260817;
long long a, b, ans;
long long read() {
    long long s = 0, w = 1;
    char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();}
    while(isdigit(ch)) s = s * 10 + ch - '0', s %= N, ch = getchar();
    return s * w;
}
long long power(long long x, long long y) {
    long long sum = 1;
    while(y) {
        if(y & 1) sum = (sum * x) % N;
        x = (x * x) % N;
        y >>= 1; 
    }
    return sum;
}
long long gcd(long long x, long long y) {
    return y == 0 ? x : gcd(y, x % y);
}
int main() {
    a = read(), b = read();
    if(gcd(b, N) != 1) printf("Angry!\n");
    else cout << (a * power(b, N - 2)) % N << endl;
    return 0;
}

謝謝收看,祝身體健康!class

相關文章
相關標籤/搜索