zoukankan      html  css  js  c++  java
  • 一本通1632【 例 2】[NOIP2012]同余方程

    1632:【 例 2】[NOIP2012]同余方程

    时间限制: 1000 ms         内存限制: 524288 KB

    【题目描述】

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

    【输入】

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

    【输出】

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

    【输入样例】

    3 10

    【输出样例】

    7

    【提示】

    数据范围与提示

    对于 40% 的数据,有 2b1000

    对于 60% 的数据,有 2b50000000

    对于 100% 的数据,有 2a,b2000000000

    sol:水模板是一件让人快乐的事。。。

    原式 Ax=1 (%B)
    -->Ax=1+By
    -->Ax-By=1
    -->Ax+By=1 (类似ax+by=c的格式)
    如果1%gcd(A,B)不等于0则无解(显然有解)

    然后就是模板了,。。。

    Ps:突然发现Exgcd里可以求gcd。。。(貌似我智障了)

    /*
    原式 Ax=1 (%B)
      -->Ax=1+By
      -->Ax-By=1
      -->Ax+By=1 (类似ax+by=c的格式)
      如果1%gcd(A,B)不等于0则无解(显然有解)
    */
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    ll A,B;
    //Ax+By=1
    inline ll gcd(ll x,ll y)
    {
        return (!y)?(x):(gcd(y,x%y));
    }
    inline void Exgcd(ll a,ll b,ll &X,ll &Y)
    {
        if(b==0)
        {
            X=1;
            Y=0;
            return;
        }
        Exgcd(b,a%b,X,Y);
        ll XX=X,YY=Y;
        X=YY;
        Y=XX-a/b*YY;
        return;
    }
    int main()
    {
        R(A); R(B);
        ll a,b,c,r,X,Y;
        a=A;
        b=B;
        c=1;
        r=gcd(A,B);
        Exgcd(a,b,X=0,Y=0);
        X=X*c/r;
        ll tmp=b/r;
        X=(X>=0)?(X%tmp):(X%tmp+tmp);
        Wl(X);
        return 0;
    }
    /*
    input
    3 10
    output
    7
    */
    View Code
  • 相关阅读:
    操作系统 第二章 进程管理
    操作系统 第一章 概述(补充)
    第六次博客作业——团队总结
    专题(十三)watch
    专题(十二)find 查找
    JVM 排查工具介绍(二)Memory Analyzer 堆内存分析工具
    Linux 学习笔记之(二)curl命令
    centos openjdk 11 安装软件包获取方式
    软件工程课程总结
    小黄衫!又一次?
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10440602.html
Copyright © 2011-2022 走看看