首页 > 代码库 > bzoj 1876

bzoj 1876

传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876

二进制gcd 学到了(‘ ‘      ) 高精还得压位,最开始没写压位,然后调了1h后又重写了一遍(‘ ‘     ) 怨念深重

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 10010;const int inf = 1000000000;struct bgint {    int n, a[maxn];     bgint() {        n = 0; memset(a, 0, sizeof(a));    }    bgint operator - (const bgint &x) const {        bgint ret; ret.n = max(x. n, this-> n);         for(int i = 1; i <= ret. n; ++ i) {            ret. a[i] += this-> a[i] - x. a[i];            if(ret. a[i] < 0) ret. a[i] += inf, ret. a[i + 1] --;        }        while(ret. a[ret. n] == 0 && ret. n != 1) ret. n --;         return ret;    }};bgint mov(const bgint &x) {    bgint ret; ret. n = x. n;    for(int i = 1; i <= ret. n; ++ i) {        ret. a[i] += x. a[i] * 2;         ret. a[i + 1] += ret. a[i] / inf;        ret. a[i] %= inf;    }    if(ret. a[ret. n + 1]) ret. n ++;    return ret;}bgint div(const bgint &x) {    bgint ret;     if(x. a[x.n] < 2) {        ret. n = x. n - 1;        for(int i = 1; i <= ret. n; ++ i) ret. a[i] = x. a[i];         ret. a[ret. n] += x. a[x.n] * inf;         for(int i = ret. n; i >= 1; -- i) ret. a[i - 1] += ret. a[i] % 2 * inf, ret. a[i] /= 2;         ret. a[0] = 0;    }    else {        ret. n = x.n;        for(int i = 1; i <= ret. n; ++ i) ret. a[i] = x. a[i];         for(int i = ret. n; i >= 1; -- i) ret. a[i - 1] += ret. a[i] % 2 * inf, ret. a[i] /= 2;         ret. a[0] = 0;    }    return ret;} bool even (const bgint &x) {     return (x. a[1] & 1);}bool is (const bgint &x, const bgint &t) {    if(x. n != t. n) return 0;    for(int i = 1; i <= x. n; ++ i) if(x. a[i] != t. a[i]) return 0;    return 1;}bool com(const bgint &x, const bgint &t) {    if(x. n > t. n) return 0;    else if(x. n < t. n) return 1;    for(int i = x. n; i >= 1; -- i) {        if(x. a[i] > t. a[i]) return 0;        else if(x. a[i] < t.a[i]) return 1;    }    return 0;}void print(const bgint &x) {    for(int i = x. n; i >= 1; -- i) {        if(i == x.n ) printf("%d", x. a[i]);        else printf("%09d", x. a[i]);    }}bgint gcd(bgint a, bgint b) {    bgint ret; ret. a[1] = 1, ret. n = 1;     int cnt = 0;    while(!is(a, b)) {        if(even(a)) {            if(even(b)) {                if(!com(a, b)) a = div((a - b));                else b = div((b - a));             }            else b = div(b);         }        else {            if(even(b)) a = div(a);            else b = div(b), a = div(a), cnt ++;        }       // ++ x; print(a); cout << " "; print(b); cout << endl;    }    for(int i = 1; i <= cnt; ++ i) a = mov(a);    return a;}char s[maxn]; bgint read() {    scanf("%s", s + 1);    bgint ret; ret. n = (int)strlen(s + 1); ret. n = ret. n % 9 == 0 ? ret. n / 9 : ret. n / 9 + 1;    int sl = (int)strlen(s + 1);    for(int i = 1; i <= ret. n; ++ i) {        int t = 1;        for(int j = (i - 1) * 9 + 1; j <= min(i * 9, sl); ++ j)             ret. a[i] += (int)(s[sl - j + 1] - ‘0‘) * t, t *= 10;     }    return ret;}void sov() {    bgint x = read(), t = read();      print(gcd(x, t));}int main() {    //freopen("test.in", "r", stdin);    //freopen("test.out", "w", stdout);    sov();    return 0;}

 

bzoj 1876