• 洛谷 P1082 同余方程


    题目描述

    求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解。

    输入输出格式

    输入格式:

    输入只有一行,包含两个正整数 a, b,用一个空格隔开。

    输出格式:

    输出只有一行,包含一个正整数 x0,即最小正整数解。输入数据保证一定有解。

    输入样例#1:
    3 10
    输出样例#1:
    7

    说明

    【数据范围】

    对于 40%的数据,2 ≤b≤ 1,000;

    对于 60%的数据,2 ≤b≤ 50,000,000;

    对于 100%的数据,2 ≤a, b≤ 2,000,000,000。

    NOIP 2012 提高组 第二天 第一题

    1.exgcd 

    屠龙宝刀点击就送

    #include<cstdio>
    
    int exgcd(int a,int b,int &x,int &y)
    {
        if(b==0)
        {
            x=1;
            y=0;
            return a;
        }
        int ans=exgcd(b,a%b,x,y);
        int temp=x;
        x=y;
        y=temp-(a/b)*y;
        return ans;
    }
    int main()
    {
        int a,b,x,y;
        scanf("%d%d",&a,&b);
        int k=exgcd(a,b,x,y);
        while(x<=0) x+=b/k;
        printf("%d",x);
        return 0;
    }

     2.欧拉定理 

    定理 2.1 (欧拉定理)
    a
    φ(p) ≡ 1(mod p)
    对于任意互质的 a,p 恒成⽴.
    欧拉定理⽤来求逆元⽤的是欧拉定理的⼀个推论:
    a × a
    φ(p)−1 ≡ 1(mod p)
    然后⽤快速幂就可以求乘法逆元了

    #include <ctype.h>
    #include <cstdio>
    void read(int &x)
    {
        x=0;bool f=0;
        register char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
        for(; isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
        x=f?(~x)+1:x;
    }
    int a,b;
    int getphi(int x)
    {
        int ans=x;
        if(x%2==0)
        {
            while(x%2==0) x/=2;
            ans/=2;
        }
        for(int i=3;i*i<=x;i+=2)
        {
            if(x%i==0)
            {
                while(x%i==0) x/=i;
                ans=ans/i*(i-1);
            }
        }
        if(x>1) ans=ans/x*(x-1);
        return ans;
    }
    long long ksm(int m,long long n,int mod)
    {
        long long r=1,base=m;
        for(;n;n>>=1)
        {
            if(n&1) r=(r*base)%mod;
            base=(base*base)%mod;
        }
        return r;
    }
    int main()
    {
    //    freopen("mod.in","r",stdin);
    //    freopen("mod.out","w",stdout);
        read(a);read(b);
        long long m=getphi(b)-1,ans;ans=ksm(a,m,b);
        while(ans<=0) ans+=b;
        printf("%d
    ",ans);
        return 0;
    }
    我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。
  • 相关阅读:
    安装SQLserver2008时出现的错误
    第二章 语法陷阱
    分享:APK高级保护方法解析(三)
    设计模式_命令模式
    POJ-3134-Power Calculus(迭代加深DFS)
    Rational Rose2007具体安装步骤
    webAPP开发的问题(总结)
    基于Linux的智能家居的设计(5)
    获取表数据的插入SQL
    POJ 3667 Hotel(线段树)
  • 原文地址:https://www.cnblogs.com/ruojisun/p/6666184.html
Copyright © 2020-2023  润新知