乘法逆元板子(两种解法)

it2025-04-22  16

仅作笔记,推荐博客https://www.cnblogs.com/dupengcheng/p/5487362.html 关于乘法逆元,一般来说就两种解法 第一种:利用费马小定理,什么是费马小定理呢? 自己去看(菜鸟说不清楚) 代码板子

ll NI(ll k,ll p)//p为取模数mod-2 { ll sum=1; while(p) { if(p&1)sum=(sum*k)%mod; k=(k*k)%mod; p >>=1; } return sum; }

第二种依靠拓展欧几里得算法 因为乘法逆元ax≡1 (mod p),所以可以写成类似拓展欧几里得的式子ax+py=1即ax+by=1;上板子

void exgcd(ll a,ll b,ll& d,ll& x,ll& y) { if(!b) { d = a; x = 1; y = 0; } else{ exgcd(b, a%b, d, y, x); y -= x*(a/b); } } ll inv(ll a, ll p) { ll d, x, y; exgcd(a, p, d, x, y); return d == 1 ? (x+p)%p : -1; }

这里推荐一个简单的逆元题https://ac.nowcoder.com/acm/problem/15950 两个板子我都写在下面的题解里了,两个都对,都试过

#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <memory.h> #include <vector> #include <map> #include <stack> #include <stdlib.h> #include <set> #include <deque> using namespace std; typedef long long ll; const ll inf = 1e13+9; #define PI = acos(-1.0); #define mem(a,b) memset(a,b,sizeof(a)) #define IOS ios::sync_with_stdio(false);cin.tie(0) #define mcy(a,b) memcpy(a,b,sizeof(a)) const int mod=1e9+7; const int maxn=2e6+9; ll NI(ll k,ll p)//p为取模数mod-2 { ll sum=1; while(p) { if(p&1)sum=(sum*k)%mod; k=(k*k)%mod; p >>=1; } return sum; } void exgcd(ll a,ll b,ll& d,ll& x,ll& y) { if(!b) { d = a; x = 1; y = 0; } else{ exgcd(b, a%b, d, y, x); y -= x*(a/b); } } ll inv(ll a, ll p) { ll d, x, y; exgcd(a, p, d, x, y); return d == 1 ? (x+p)%p : -1; } int main() { ll n,s; while(~scanf("%lld",&n)) { n%=mod; s=n*(n+1)%mod; s=s*(2*n+1)%mod; ll k=inv(6,mod); s=(s*k)%mod; printf("%lld\n",s); } return 0; }
最新回复(0)