您的位置:首页 > 编程语言 > C语言/C++

C++——拓展欧几里得模板——同余方程【NOIP2012提高组】

2017-01-18 16:20 447 查看

同余方程


题目背景

NOIP2012 提高组 DAY2 试题。


题目描述

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


输入格式

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


输出格式

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


样例数据 1

输入  [复制]

3 10
输出

7


备注

【数据范围】

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

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

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
long long a,b,x,y;
long long gcd(long long a,long long b,long long &x,long long &y)
{
if(a<b) swap(a,b);
if(b==0)
{
x=1;
y=0;
return a;
}
long long ret=gcd(b,a%b,x,y);
long long temp=x;
x=y;
y=temp-a/b*y;
return ret;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>a>>b;
gcd(a,b,x,y);
if(a*x+b*y==1)
cout<<(x%b+b)%b<<endl;
else
cout<<(y%b+b)%b<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 算法