[模板] 有理數取余
阿新 • • 發佈:2018-09-23
ctime double 整數 n) div string utc 取模 int
有理數取余其實不是一個單獨的東西,其實就是一個費馬小定理的應用,但是這個題的數據範圍對於不用快讀的人有點不友好,我看一個哥們用快讀調了3天,然而我20分鐘就做完了。
關於讀入,就直接在快讀中加入一個取模就行了。然後直接費馬小定理,但一開始忘了無解的情況,假如b為0就是分母為0,無解。
題幹:
題目描述 給出一個有理數c=abc=\frac{a}{b}c=b a?,求c mod19260817c\ \bmod 19260817c mod19260817的值。 輸入輸出格式 輸入格式: 一共兩行。 第一行,一個整數aaa。 第二行,一個整數bbb。 輸出格式: 一個整數,代表求余後的結果。如果無解,輸出Angry! 輸入輸出樣例 輸入樣例#1: 復制 233 666 輸出樣例#1: 復制 18595654 說明 對於所有數據,0≤a,b≤10100010\leq a,b \leq 10^{10001}0≤a,b≤1010001
代碼:
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<string> #include<cstring> using namespace std; #define duke(i,a,n) for(ll i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; const long long mod = 19260817; typedef long long ll; typedef double db; template <class T> voidread(T &x) { char c; bool op = 0; while(c = getchar(), c < ‘0‘ || c > ‘9‘) if(c == ‘-‘) op = 1; x = c - ‘0‘; while(c = getchar(), c >= ‘0‘ && c <= ‘9‘) x = (x * 10 % mod + c - ‘0‘) % mod; if(op) x = -x; } template <class T> void write(T x) { if(x < 0) putchar(‘-‘), x = -x; if(x >= 10) write(x / 10); putchar(‘0‘ + x % 10); } ll a,b; ll ksm(ll x,ll y) { ll tot = 1; while(y) { if(y % 2 == 1) tot *= x; tot %= mod; x *= x; x %= mod; y >>= 1; } return tot; } int main() { read(a);read(b); if(b == 0) { printf("Angry!\n"); return 0; } ll ans = a * ksm(b,mod - 2); printf("%lld\n",(ans % mod + mod) % mod); return 0; }
[模板] 有理數取余