bzoj 1876: [SDOI2009]SuperGCD (高精度+gcd)

1876: [SDOI2009]SuperGCD

Time Limit: 4 Sec   Memory Limit: 64 MB
Submit: 3251   Solved: 1122
[ Submit][ Status][ Discuss]

Description

Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个程序来教训他。

Input

共两行: 第一行:一个数A。 第二行:一个数B。

Output

一行,表示A和B的最大公约数。

Sample Input

12
54

Sample Output

6

HINT

对于20%的数据,0 < A , B ≤ 10 ^ 18。
对于100%的数据,0 < A , B ≤ 10 ^ 10000。

Source

Day1

[ Submit][ Status][ Discuss]

题解:高精度+gcd

刚开始写的方法TLE了,所以照着网上的姿势写的。。。

#include
#include
#include
#include
#include
#define N 100006
#define inf 100000000
#define mx 1252
using namespace std;
char s[N],s1[N];
struct data{
	int len,s[mx+10];
	data() {
		memset(s,0,sizeof(s));
	}
	int &operator [](int i) {
		return s[i];
	}
	void operator /=(int x){
		for (int i=mx;i>=1;i--) 
		 s[i-1]+=s[i]%x*inf,s[i]/=x;
	}
	void operator -=(data &b) {
		for (int i=1;i (data &b) {
		for (int i=mx;i>=1;i--) 
			if (b[i]!=s[i]) return s[i]>b[i];
		return 0;
	}
	void print() {
		int p=mx;
		while (!s[p]&&p>0) p--;
		printf("%d",s[p--]);
		while (p) printf("%08d",s[p--]);
		putchar('\n');
	}
	bool iszero() {
		for (int i=1;i0)             
		  sscanf(tp+L-8*p+++1,"%08d",&s[p]);
    }
}a1,b1;
data gcd(data a,data b)
{ 
    int g=0; bool x,y;
	while (!a.iszero()&&!b.iszero()) {
		x=!(a[1]&1); y=!(b[1]&1);
		if (x&&y) g++,a/=2,b/=2;
		else if (x||y) {
			if (x) a/=2; 
			if (y) b/=2;
		}
		else {
			if (a>b) a-=b;
			else b-=a;
		}
	}
	if (b>a) a=b;
	for (int i=0;i


你可能感兴趣的:(数论)