B - Modular Inverse
生活随笔
收集整理的這篇文章主要介紹了
B - Modular Inverse
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
The modular modular multiplicative inverse of an integer a modulo m is an integer x such that a-1≡x (mod m). This is equivalent to ax≡1 (mod m).
Input
There are multiple test cases. The first line of input is an integer T ≈ 2000 indicating the number of test cases.
Each test case contains two integers 0 < a ≤ 1000 and 0 < m ≤ 1000.
<h4< dd="">Output
For each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".
<h4< dd="">Sample Input
3 3 11 4 12 5 13<h4< dd="">Sample Output
4 Not Exist 8這題就是求乘法逆元
我用的方法比較復雜,我是這么想的,先判斷a和f是不是互質,如果互質才有乘法逆元,否則沒有乘法逆元,費馬小定理可以求出膜是素數的乘法逆元,歐拉定理可以求出膜是非素數的乘法逆元:
具體方法:費馬小定理,先要判斷是不是素數,然后再用快速冪
歐拉定理,先要寫歐拉函數,然后再用快速冪,其中歐拉函數需要一個質數的數組isp
所以用這種方法要寫很多的函數,不過也好,昨天學的,正好好好的復習一下 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; typedef long long ll; const int maxn=1e5; int p[maxn];//素數篩 void init() {for(int i=2;i<maxn;i++) p[i]=1;for(int i=2;i*i<maxn;i++){if(p[i]){for(int j=i*i;j<maxn;j+=i){p[j]=0;}}} } //v數組記錄每一個i的最小質因數,isp記錄所有的質數 int v[maxn],isp[maxn],m; void init1() {for(int i=2;i<maxn;i++){if(v[i]==0){isp[m++]=i;v[i]=i;}for(int j=0;j<m;j++){if(v[i]<isp[j]||i*isp[j]>maxn) break;v[i*isp[j]]=isp[j];}} }int gcd(int a,int b) {return b==0? a:gcd(b,a%b); } int euler(int n) {int res=n;for(int i=0;i<m;i++){if(n%isp[i]==0){res=res*(isp[i]-1)/isp[i];}}return res; } int mod; ll mod_pow(ll x,int n) {ll ans=1;while(n){if(n & 1) ans=ans*x%mod;x=x*x%mod;n>>=1;}return ans; }int main() {int t;scanf("%d",&t);while(t--){int f;ll a;scanf("%I64d%d",&a,&f);init();init1();mod=f;int ans;if(gcd(a,f)==1){if(p[f])//費馬小定理{ans=mod_pow(a,f-2);}else//歐拉定理{int exa=euler(f);ans=mod_pow(a,exa-1);}}else {printf("Not Exist\n");continue;}printf("%d\n",ans);}return 0; }
轉載于:https://www.cnblogs.com/EchoZQN/p/10290570.html
總結
以上是生活随笔為你收集整理的B - Modular Inverse的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CDN和智能DNS原理和应用 (原)
- 下一篇: win10怎么设置启动 Win10如何设