[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。
【思路】
就是裸的欧几里得……然而考试的时候并没有想到……数论学的时候好不容易听懂的一个题,一到考试还是不记得,所以说一定要进行整理!
【代码】
1 //扩展欧几里得: 2 #include <cstdio> 3 4 int a, b; 5 6 int exgcd(int a,int b,int &x,int &y) 7 { 8 if(b==0) 9 { 10 x=1,y=0; 11 return a; 12 } 13 int r=exgcd(b,a%b,x,y),tmp; 14 tmp=x,x=y,y=tmp-a/b*y; 15 return r; 16 } 17 /* 18 void exgcd(int a, int b, int &x, int &y) 19 { 20 if (!b) 21 { 22 x = 1, y = 0; 23 return; 24 } 25 int q = a / b, r = a % b; 26 exgcd(b, r, y, x); 27 y -= q * x; 28 } 29 */ 30 31 int main() { 32 scanf("%d%d", &a, &b); 33 34 int x, y; 35 exgcd(a, b, x, y); 36 37 while (x < 0) x = x + b; 38 39 printf("%d", x); 40 return 0; 41 }
然而我的代码就是打暴力:
(我都不知道我是怎么打出来的样例过了我就交上了,竟然能够A 6个点)
上代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 #include<cmath> 7 #include<cstdlib> 8 9 using namespace std; 10 11 long long a,b,k;//对于 40%的数据,2 ≤b≤ 1,000; 对于 60%的数据,2 ≤b≤ 50,000,000; 对于 100%的数据,2 ≤a, b≤ 2,000,000,000。 12 long long x0=1; 13 14 void ss(long long b) 15 { 16 while(x0<a*b) 17 { 18 if((a*x0)%b==1) 19 { 20 printf("%lld",x0); 21 return; 22 } 23 else ++x0; 24 25 } 26 if(x0==a*b) 27 { 28 b+=b; 29 ss(b); 30 } 31 } 32 33 int main() 34 { 35 freopen("mod.in","r",stdin); 36 freopen("mod.out","w",stdout); 37 scanf("%lld%lld",&a,&b); 38 if(a>b) 39 { 40 a=a%b; 41 } 42 if(a<b) 43 { 44 ss(b); 45 } 46 fclose(stdin); 47 fclose(stdout); 48 return 0; 49 }