[模板] 有理数取余
Posted dukelv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] 有理数取余相关的知识,希望对你有一定的参考价值。
有理数取余其实不是一个单独的东西,其实就是一个费马小定理的应用,但是这个题的数据范围对于不用快读的人有点不友好,我看一个哥们用快读调了3天,然而我20分钟就做完了。
关于读入,就直接在快读中加入一个取模就行了。然后直接费马小定理,但一开始忘了无解的情况,假如b为0就是分母为0,无解。
题干:
题目描述 给出一个有理数c=abc=frac{a}{b}c=b a?,求c mod19260817c mod 19260817c mod19260817的值。 输入输出格式 输入格式: 一共两行。 第一行,一个整数aaa。 第二行,一个整数bbb。 输出格式: 一个整数,代表求余后的结果。如果无解,输出Angry! 输入输出样例 输入样例#1: 复制 233 666 输出样例#1: 复制 18595654 说明 对于所有数据,0≤a,b≤10100010leq 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! "); return 0; } ll ans = a * ksm(b,mod - 2); printf("%lld ",(ans % mod + mod) % mod); return 0; }
以上是关于[模板] 有理数取余的主要内容,如果未能解决你的问题,请参考以下文章