一本通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('\n')
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

 

posted @ 2019-02-26 22:16  yccdu  阅读(436)  评论(0编辑  收藏  举报