[复习][NOIP2012真题]拓展欧几里得 同余方程

来源:互联网 发布:淘宝美工是平面美工吗 编辑:程序博客网 时间:2024/05/17 09:30

题目背景
NOIP2012 提高组 DAY2 试题。

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

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

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

样例数据
输入

3 10

输出

7

备注
【数据范围】
对于 40% 的数据,2≤b≤1,000;
对于 60% 的数据,2≤b≤50,000,000;
对于 100% 的数据,2≤a,b≤2,000,000,000。

分析:拓展欧几里得模板,如果不懂拓展欧几里得,详见zhj5chengfeng的博客。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<set>using namespace std;int getint(){    int sum=0,f=1;    char ch;    for(ch=getchar();!isdigit(ch)&&ch!='-';ch=getchar());    if(ch=='-')    {        f=-1;        ch=getchar();    }    for(;isdigit(ch);ch=getchar())        sum=(sum<<3)+(sum<<1)+ch-48;    return sum*f;}void exgcd(int a,int b,int &x,int &y)//x、y带&号表示在exgcd函数中x、y发生变化,主程序中x、y也会跟着变{    if(!b)    {        x=1,y=0;        return;    }    exgcd(b,a%b,x,y);    int tmp=x;    x=y,y=tmp-a/b*y;}int main(){    freopen("exgcd.in","r",stdin);    freopen("exgcd.out","w",stdout);    int x,y,a,b;    a=getint(),b=getint();    exgcd(a,b,x,y);    cout<<(x%b+b)%b<<'\n';    return 0;}

本题结。

原创粉丝点击