#include <iostream> #include <cstring> #define si short int #define ui unsigned int #define FOR(a, b, c) for(ui b=a; b<c; b++) #define MAX(a, b) (a>b?a:b) #define max_number_of_digits 2048 using namespace std; struct BigNum { bool sign; ui lenght; si* digits; BigNum () { digits = new si[0]; lenght=0; sign=0; } BigNum (si s, ui l, si* d) { digits = new si[max_number_of_digits]; lenght = l; sign = s; memmove(digits, d, max_number_of_digits*sizeof(si)); } BigNum (si s, ui l, char* d) { digits = new si[max_number_of_digits]; lenght = l; sign = s; FOR(0, i, l) digits[max_number_of_digits-(l-i+1)]=(si)(d[i]-'0'); } BigNum (si s, ui l, const string & d) { digits = new si[max_number_of_digits]; lenght = l; sign = s; FOR(1, i, l+1) digits[max_number_of_digits-(i)]=(si)(d[l-(i)]-'0'); } }; ostream & operator << (ostream & out, const BigNum & s) { for(ui i=s.lenght; i>0; i--) out << s.digits[max_number_of_digits-i]; return out; } istream & operator >> (istream & in, BigNum & s) { string tmp; in >> tmp; s=BigNum(0, tmp.size(), tmp); return in; } BigNum operator+ (BigNum & a, BigNum & b) { si* tmp=new si[max_number_of_digits]; FOR(0, i, 2048) tmp[i]=0; for(ui i=max_number_of_digits-1; i>max_number_of_digits-(MAX(a.lenght, b.lenght)+1); i--) { tmp[i]+=a.digits[i]+b.digits[i]; if(tmp[i]>=10) { tmp[i-1]=tmp[i]/10; tmp[i]%=10; } } return BigNum(a.sign*b.sign, MAX(a.lenght, b.lenght)+(tmp[max_number_of_digits-(MAX(a.lenght, b.lenght))]==0?1:0), tmp); } BigNum operator- (BigNum & a, BigNum & b) { si* tmp=new si[max_number_of_digits]; for(ui i=max_number_of_digits-1; i>max_number_of_digits-(MAX(a.lenght, b.lenght)+1); i--) { tmp[i]+=a.digits[i]-b.digits[i]; if(tmp[i]<0) { tmp[i-1]--; tmp[i]+=10; } } si num=0; for(int i=max_number_of_digits-(MAX(a.lenght, b.lenght)+1); i<max_number_of_digits; i++) if(tmp[i]!=0) { num=max_number_of_digits-i; break; } num==0?num=1:0; return BigNum(a.sign*b.sign, num, tmp); } bool operator < (BigNum & a, BigNum & b) { if(a.lenght!=b.lenght) return a.lenght<b.lenght; for(int i=max_number_of_digits-a.lenght-1; i<max_number_of_digits; i++) if(a.digits[i]!=b.digits[i]) return a.digits[i]<b.digits[i]; return false; } bool operator == (BigNum & a, BigNum & b) { if(a.lenght!=b.lenght) return false; for(int i=max_number_of_digits-a.lenght-1; i<max_number_of_digits; i++) if(a.digits[i]!=b.digits[i]) return false; return true; } bool operator != (BigNum & a, BigNum & b) { return !(a==b); } bool operator<= (BigNum & a, BigNum & b) { if(a.lenght!=b.lenght) return a.lenght<=b.lenght; for(int i=max_number_of_digits-a.lenght-1; i<max_number_of_digits; i++) if(a.digits[i]<b.digits[i]) return a.digits[i]<b.digits[i]; return false; } bool operator> (BigNum & a, BigNum & b) { return b<a; } bool operator>= (BigNum & a, BigNum & b) { return b<=a; } BigNum operator* (BigNum & a, int b) { if (b==2) { si* tmp=new si[max_number_of_digits]; FOR(0, i, 2048) tmp[i]=0; for(ui i=max_number_of_digits-1; i>max_number_of_digits-a.lenght-1; i--) { tmp[i]+=a.digits[i]*2; if(tmp[i]>=10) { tmp[i-1]=tmp[i]/10; tmp[i]%=10; } } return BigNum(a.sign, a.lenght+(tmp[max_number_of_digits-(a.lenght)]==0?1:0), tmp); } return BigNum(); } BigNum operator/ (BigNum & a, int b) { si* tmp=new si[max_number_of_digits]; for(ui i=max_number_of_digits-(a.lenght); i<max_number_of_digits; i++) { tmp[i]+=a.digits[i]; if(tmp[i]%2==1) tmp[i+1]+=10; tmp[i]/=2; } si num; for(int i=max_number_of_digits-(a.lenght+1); i<max_number_of_digits; i++) if(tmp[i]!=0) { num=max_number_of_digits-i; break; } num==0?num=1:0; return BigNum(a.sign, num, tmp); } int operator% (BigNum & a, int b) { if(b==2) { return a.digits[max_number_of_digits-1]%2; } return 0; } bool operator== (BigNum & a, char b) { if(a.digits[max_number_of_digits-1]+'0'==b && a.lenght==1) return true; return false; } BigNum NWD(BigNum a, BigNum b) { si* tmp=new si[max_number_of_digits]; tmp[max_number_of_digits-1]=1; BigNum zero(0, 1, tmp); ui dwojki=0; //cout << "dupa" <<endl; if(a<b) swap(a, b); while (!(b=='0') && !(b=='1')) { if(a%2==0 && b%2==0) { dwojki++; a=a/2; b=b/2; cout << "(a%2==0 && b%2==0): " << a << ", " << b <<endl; } else if(a%2==1 && b%2==0) { b=b/2; cout << "(a%2==1 && b%2==0): " << a << ", " << b <<endl; } else if(a%2==0 && b%2==1) { a=a/2; cout << "(a%2==1 && b%2==0): " << a << ", " << b <<endl; } else if(a%2==1 && b%2==1) { a=a-b; cout << "(a%2==1 && b%2==1): " << a << ", " << b <<endl; } //if(b==zero || a==zero) break; if(a<b) swap(a, b); } while (dwojki--) { a=a*2; } return a; } int main () { BigNum t(0, 1, string("1")); for (int i=0; i<13; ++i) { t = t * 2; cout << t << endl; } cout << endl << endl; BigNum k, l; while (cin >> k >> l) { cout << NWD (l, k) << endl; } return 0; }
21 14 39 65 1536 1024 1235452 323452 5540979424919883 2018649707723796
2 4 8 6 2 4 8 6 2 4 8 6 2 (a%2==1 && b%2==0): 21, 7 (a%2==1 && b%2==1): 14, 7 (a%2==1 && b%2==0): 7, 7 (a%2==1 && b%2==1): 0, 7 7 (a%2==1 && b%2==1): 26, 39 (a%2==1 && b%2==0): 39, 13 (a%2==1 && b%2==1): 26, 13 (a%2==1 && b%2==0): 13, 13 (a%2==1 && b%2==1): 0, 13 13 (a%2==0 && b%2==0): 768, 512 (a%2==0 && b%2==0): 384, 256 (a%2==0 && b%2==0): 192, 128 (a%2==0 && b%2==0): 96, 64 (a%2==0 && b%2==0): 48, 32 (a%2==0 && b%2==0): 24, 16 (a%2==0 && b%2==0): 12, 8 (a%2==0 && b%2==0): 6, 4 (a%2==0 && b%2==0): 3, 2 (a%2==1 && b%2==0): 3, 1 6 (a%2==0 && b%2==0): 617726, 161726 (a%2==0 && b%2==0): 308863, 80863 (a%2==1 && b%2==1): 228000, 80863 (a%2==1 && b%2==0): 114000, 80863 (a%2==1 && b%2==0): 57000, 80863 (a%2==1 && b%2==0): 80863, 28500 (a%2==1 && b%2==0): 80863, 14250 (a%2==1 && b%2==0): 80863, 7125 (a%2==1 && b%2==1): 73738, 7125 (a%2==1 && b%2==0): 36869, 7125 (a%2==1 && b%2==1): 29744, 7125 (a%2==1 && b%2==0): 14872, 7125 (a%2==1 && b%2==0): 7436, 7125 (a%2==1 && b%2==0): 3718, 7125 (a%2==1 && b%2==0): 7125, 1859 (a%2==1 && b%2==1): 5266, 1859 (a%2==1 && b%2==0): 2633, 1859 (a%2==1 && b%2==1): 774, 1859 (a%2==1 && b%2==0): 1859, 387 (a%2==1 && b%2==1): 1472, 387 (a%2==1 && b%2==0): 736, 387 (a%2==1 && b%2==0): 368, 387 (a%2==1 && b%2==0): 387, 184 (a%2==1 && b%2==0): 387, 92 (a%2==1 && b%2==0): 387, 46 (a%2==1 && b%2==0): 387, 23 (a%2==1 && b%2==1): 364, 23 (a%2==1 && b%2==0): 182, 23 (a%2==1 && b%2==0): 91, 23 (a%2==1 && b%2==1): 68, 23 (a%2==1 && b%2==0): 34, 23 (a%2==1 && b%2==0): 17, 23 (a%2==1 && b%2==1): 6, 17 (a%2==1 && b%2==0): 17, 3 (a%2==1 && b%2==1): 14, 3 (a%2==1 && b%2==0): 7, 3 (a%2==1 && b%2==1): 4, 3 (a%2==1 && b%2==0): 2, 3 (a%2==1 && b%2==0): 3, 1 2 (a%2==1 && b%2==0): 5540979424919883, 1009324853861898 (a%2==1 && b%2==0): 5540979424919883, 504662426930949 (a%2==1 && b%2==1): 5036316997988934, 504662426930949 (a%2==1 && b%2==0): 2518158498994467, 504662426930949 (a%2==1 && b%2==1): 2013496072063518, 504662426930949 (a%2==1 && b%2==0): 1006748036031759, 504662426930949 (a%2==1 && b%2==1): 502085609100810, 504662426930949 (a%2==1 && b%2==0): 504662426930949, 251042804550405 (a%2==1 && b%2==1): 253619622380544, 251042804550405 (a%2==1 && b%2==0): 126809811190272, 251042804550405 (a%2==1 && b%2==0): 251042804550405, 63404905595136 (a%2==1 && b%2==0): 251042804550405, 31702452797568 (a%2==1 && b%2==0): 251042804550405, 15851226398784 (a%2==1 && b%2==0): 251042804550405, 7925613199392 (a%2==1 && b%2==0): 251042804550405, 3962806599696 (a%2==1 && b%2==0): 251042804550405, 1981403299848 (a%2==1 && b%2==0): 251042804550405, 990701649924 (a%2==1 && b%2==0): 251042804550405, 495350824962 (a%2==1 && b%2==0): 251042804550405, 247675412481 (a%2==1 && b%2==1): 250795129137924, 247675412481 (a%2==1 && b%2==0): 125397564568962, 247675412481 (a%2==1 && b%2==0): 62698782284481, 247675412481 (a%2==1 && b%2==1): 62451106872000, 247675412481 (a%2==1 && b%2==0): 31225553436000, 247675412481 (a%2==1 && b%2==0): 15612776718000, 247675412481 (a%2==1 && b%2==0): 7806388359000, 247675412481 (a%2==1 && b%2==0): 3903194179500, 247675412481 (a%2==1 && b%2==0): 1951597089750, 247675412481 (a%2==1 && b%2==0): 975798544875, 247675412481 (a%2==1 && b%2==1): 728123132394, 247675412481 (a%2==1 && b%2==0): 364061566197, 247675412481 (a%2==1 && b%2==1): 116386153716, 247675412481 (a%2==1 && b%2==0): 247675412481, 58193076858 (a%2==1 && b%2==0): 247675412481, 29096538429 (a%2==1 && b%2==1): 218578874052, 29096538429 (a%2==1 && b%2==0): 109289437026, 29096538429 (a%2==1 && b%2==0): 54644718513, 29096538429 (a%2==1 && b%2==1): 25548180084, 29096538429 (a%2==1 && b%2==0): 29096538429, 12774090042 (a%2==1 && b%2==0): 29096538429, 6387045021 (a%2==1 && b%2==1): 22709493408, 6387045021 (a%2==1 && b%2==0): 11354746704, 6387045021 (a%2==1 && b%2==0): 5677373352, 6387045021 (a%2==1 && b%2==0): 6387045021, 2838686676 (a%2==1 && b%2==0): 6387045021, 1419343338 (a%2==1 && b%2==0): 6387045021, 709671669 (a%2==1 && b%2==1): 5677373352, 709671669 (a%2==1 && b%2==0): 2838686676, 709671669 (a%2==1 && b%2==0): 1419343338, 709671669 (a%2==1 && b%2==0): 709671669, 709671669 (a%2==1 && b%2==1): 0, 709671669 709671669