zoukankan      html  css  js  c++  java
  • 洛谷 P2152 [SDOI2009]SuperGCD (高精度)

    这道题直接写了我两个多小时……

    主要是写高精度的时候还存在着一些小毛病,调了很久

    在输入这一块卡了很久。

    然后注意这里用while的形式写,不然会炸

    最后即使我已经是用的万进制了,但是交上去还是有两个点超时

    然后就开始漫长的改进,一直过不了那两个点。

    然后突然发现,貌似这道题没有涉及到乘法。

    那不就可以直接开10的九次方为一位了(10的9次方是int的最大数量级)

    我交上去之后就AC了,全部测试点交上去总和4.6秒

    然后原来我一个数开的是2500这么大,因为题目给的10000位,之前用万进制除以4就是2500

    然后我现在改成了1200,大约是10000除以9

    然后……

    交上去总和3秒

    直接快了一秒多

    而且单个测试点最多也就0.7秒,而这道题的最大限制是2s

    看来省空间的时候时间也省了很多

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    #define _for(i, a, b) for(int i = (a); i <= (b); i++)
    using namespace std;
    
    const int MAXN = 1200;
    const int base = 1e9;
    struct bignum
    {
        int len, s[MAXN];
        bignum() { len = 0; memset(s, 0, sizeof(s)); }
    };
    
    bignum operator - (bignum a, const bignum& b)
    {
        for(int i = a.len; i >= 1; i--)
        {
            a.s[i] -= b.s[i];
            if(a.s[i] < 0) a.s[i+1]--, a.s[i] += base;
        }
        while(!a.s[a.len] && a.len > 0) a.len--;
        return a;
    }
    
    bool judge(bignum a, bignum b) //这种写法很简略 
    {
        if(a.len != b.len) return a.len > b.len;
        for(int i = a.len; i >= 1; i--)
            if(a.s[i] != b.s[i]) return a.s[i] > b.s[i];
        return true;
    }
    
    bignum operator % (bignum a, bignum b)
    {
        while(judge(a, b)) a = a - b;
        return a;
    }
    
    char str[10000 + 5];
    void read(bignum& a) //这个输入代码写了好久 
    {
        scanf("%s", str);
        reverse(str, str + strlen(str)); //先翻转在说 
        int& len = a.len = 0;
        for(int i = 0, w; i < strlen(str); i++, w *= 10)
        {
            if(i % 9 == 0) len++, w = 1;
            a.s[len] += w * (str[i] - '0');
        }
    }
    
    void print(bignum a)
    {
        printf("%d", a.s[a.len]);
        for(int i = a.len - 1; i >= 1; i--)
            printf("%09d", a.s[i]);
        puts("");
    }
    
    int main()
    {
        bignum a, b, c;
        read(a); read(b);
        while(b.len) //规定len = 0时值为0 
        {
            c = a % b;
            a = b;
            b = c;
        }
        print(a);
        return 0;
    }
  • 相关阅读:
    bzoj 2882: 工艺 后缀自动机
    bzoj 2002: 弹飞绵羊 Link-Cut-Tree
    bzoj 3881: [Coci2015]Divljak AC自动机
    bzoj 2553: [BeiJing2011]禁忌 AC自动机+矩阵乘法
    bzoj 3172: [Tjoi2013]单词 fail树
    bzoj 2434: 阿狸的打字机 fail树+离线树状数组
    bzoj 1030: 文本生成器 AC自动机+dp
    SAS FORMAT 逻辑库存储 【输出格式 没有找到或无法加载】解决方法
    PROC UNIVARIATE 简单示例
    SAS ODS GRAPHICS SGPLOT 画图 指存放定路径、名称、指定格式
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819342.html
Copyright © 2011-2022 走看看