zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    JVM理解
    ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用
    Add Two Numbers
    Two Sum
    JS实现总价随数量变化而变化(顾客购买商品表单)
    族谱管理系统(孩子兄弟存储结构)
    Java登录界面的实现(注册、登录、背景图片)
    Java GUI记账本(基于Mysql&&文件存储两种版本)
    几种对栈操作的方法
    Java中的成员内部类
  • 原文地址:https://www.cnblogs.com/ianaesthetic/p/4251741.html
Copyright © 2011-2022 走看看