【代码】 四法求逆元
来源:互联网 发布:苏轼 柳永 知乎 编辑:程序博客网 时间:2024/05/21 08:53
本文应该真的差不多就只有代码
不要脸地说一句其实要学的话只看代码也能知道方法了,还是写得比较结构化的
#include <cstdio>typedef long long ll;ll Qpow(ll x, ll n, ll p){ ll ans = 1; while (n){ if (n & 1) ans = ans * x % p; x = x * x % p; n >>= 1; }return ans;}void Exgcd(ll a, ll p, ll &x, ll &y){ if (!p){x = 1, y = 0;} else {Exgcd(p, a % p, y, x); y -= x * (a / p);}}ll GetExgcd(ll a, ll p){ ll res, tmp; Exgcd(a, p, res, tmp); return (res % p + p) % p;}struct Euler{ static const int maxn = 1e5; bool book[maxn]; int prime[maxn], tot; int phi[maxn]; void Work(int p){ tot = 0; phi[1] = 1; for (int i = 2; i <= p; ++i){ if (!book[i]){ prime[++tot] = i; phi[i] = i - 1; } for (int j = 1, nxt; j <= tot; ++i){ if ((nxt = i * prime[j]) > p) break; book[nxt] = 1; if (i % prime[j] == 0){ phi[nxt] = phi[i] * prime[j]; break; } phi[nxt] = phi[i] * (prime[j] - 1); } } } ll Get(ll a, ll p){ Work(p); return Qpow(a, phi[p] - 1, p); }};ll LinearRecurrence(ll a, ll p){ if (a == 1) return 1; return LinearRecurrence(p % a, p) * (p - p / a);}ll Femat(ll a, ll p){ return Qpow(a, p - 2, p);}int main (){ ll a, p; scanf ("%lld%lld", &a, &p); Euler res; printf ("Femat: %lld\nExgcd: %lld\nEuler: %lld\n", Femat(a, p), GetExgcd(a, p), res.Get(a, p)); if (a <= p) printf ("LinearRecurrence: %lld", LinearRecurrence(a, p)); return 0;}
阅读全文
0 0
- 【代码】 四法求逆元
- 代码
- 代码!
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- 代码
- PAT B1059.C语言竞赛
- JS 解析JSON字符串 得到对象数组
- 锤子剪子布
- 带权并查集,经典-食物链,poj-1182
- Android Studio debug使用release的签名,省去微信登录之类的要打成正式包才能测试的麻烦!
- 【代码】 四法求逆元
- [数组]递归方式求和
- 遍历二叉树的神级方法(Morris)
- JavaScript 的this对象
- Tomcat 添加外部CLASSPATHP配置 --------- WEB工程配置文件独立部署
- Java多线程详解
- ASP.net 解析 JSON字符串得到数组
- python url 解析
- 多线程(一)