[NOIP2012] 同余方程(第三次考试大整理)

1265. [NOIP2012] 同余方程

输入文件:mod.in   输出文件:mod.out   简单对比
时间限制:1
s   内存限制:128 MB

【题目描述】

求关于 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。

【思路】

  就是裸的欧几里得……然而考试的时候并没有想到……数论学的时候好不容易听懂的一个题,一到考试还是不记得,所以说一定要进行整理!

【代码】

 //扩展欧几里得:
#include <cstdio> int a, b; int exgcd(int a,int b,int &x,int &y)
{
if(b==)
{
x=,y=;
return a;
}
int r=exgcd(b,a%b,x,y),tmp;
tmp=x,x=y,y=tmp-a/b*y;
return r;
}
/*
void exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return;
}
int q = a / b, r = a % b;
exgcd(b, r, y, x);
y -= q * x;
}
*/ int main() {
scanf("%d%d", &a, &b); int x, y;
exgcd(a, b, x, y); while (x < ) x = x + b; printf("%d", x);
return ;
}

然而我的代码就是打暴力:

(我都不知道我是怎么打出来的样例过了我就交上了,竟然能够A 6个点)

上代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib> using namespace std; long long a,b,k;//对于 40%的数据,2 ≤b≤ 1,000; 对于 60%的数据,2 ≤b≤ 50,000,000; 对于 100%的数据,2 ≤a, b≤ 2,000,000,000。
long long x0=; void ss(long long b)
{
while(x0<a*b)
{
if((a*x0)%b==)
{
printf("%lld",x0);
return;
}
else ++x0; }
if(x0==a*b)
{
b+=b;
ss(b);
}
} int main()
{
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
scanf("%lld%lld",&a,&b);
if(a>b)
{
a=a%b;
}
if(a<b)
{
ss(b);
}
fclose(stdin);
fclose(stdout);
return ;
}
上一篇:mysql新建用户的方法


下一篇:递归和递推(一)