1. 程式人生 > >[模板] 有理數取余

[模板] 有理數取余

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> void
read(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; }

[模板] 有理數取余