前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >J - Modular Inverse ZOJ - 3609 【求逆元,拓展欧几里得 】

J - Modular Inverse ZOJ - 3609 【求逆元,拓展欧几里得 】

作者头像
Lokinli
发布2023-03-09 15:07:41
2990
发布2023-03-09 15:07:41
举报
文章被收录于专栏:以终为始

J - Modular Inverse

ZOJ - 3609 

The modular modular multiplicative inverse of an integer a modulo m is an integer xsuch 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.

Output

For each test case, output the smallest positive x. If such x doesn't exist, output "Not Exist".

Sample Input

代码语言:javascript
复制
3
3 11
4 12
5 13

Sample Output

代码语言:javascript
复制
4
Not Exist
8

 &:1 的逆元就是 1。

代码语言:javascript
复制
//#include <bits/stdc++.h>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <iostream>
#define rep(i,a,b) for(int i = (a); i < (b); i ++)
#define per(i,a,b) for(int i = (a); i > (b); i --)
#define MM(a) memset(a,0,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll maxn = 300;
const ll mod = 1e9 + 7;
ll extend_gcd(ll a, ll b, ll &x, ll &y)
{
    if(b==0)
    {
        x=1ll;
        y=0;
        return a;
    }
    else
    {
        ll r = extend_gcd(b,a%b,y,x);
        y-=x*(a/b);
        return r;
    }
}
vector<ll>line_mod(ll a,ll b,ll n)
{
    ll x,y;
    ll d=extend_gcd(a,n,x,y);
    vector<ll>ans;
    ans.clear();
    if(b%d==0)
    {
        x%=n;
        x+=n;
        x%=n;
        ans.push_back(x*(b/d)%(n/d));
        for(ll i=1; i<d; ++i)
        {
            ans.push_back((ans[0]+i*n/d)%n);
        }
    }
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll a,m;
        scanf("%lld %lld",&a,&m);
        vector<ll>ans = line_mod(a,1ll,m);
        sort(ans.begin(), ans.end());
        if(ans.empty())printf("Not Exist\n");
        else if(ans[0] == 0) printf("1\n");
        else printf("%lld\n",ans[0]);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • J - Modular Inverse
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档