1876: [SDOI2009]SuperGCD(高精度+更相减损法求GCD)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1876

高精度的话辗转相除明显不靠谱,那么就用更相减损法来求最大公约数即可,然后练手一下高精度即可。

代码(压了9位的高精,跑得蛮快的):

include <cstdio>

include <algorithm>

include <cstring>

using namespace std ;

define rep( i , x ) for ( int i = 0 ; i ++ < x ; )

define REP( i , l , r ) for ( int i = l ; i <= r ; ++ i )

define DOWN( i , r , l ) for ( int i = r ; i >= l ; -- i )

const int maxn = 1310 , maxb = 9 ;

int p[ maxb + 1 ] ;

inline void INIT( ) {

p[ 0 ] = 1 ; rep( i , maxb ) p[ i ] = p[ i - 1 ] * 10 ;

}

char s[ maxn * maxb ] ;

struct bignum {

int a[ maxn ] , n ;

 

bignum(  ) {

    memset( a , 0 , sizeof( a ) ) ;

}

 

inline void read(  ) {

    scanf( "%s" , s + 1 ) ;

    int len = strlen( s + 1 ) , val ;

    if ( len == 1 && s[ 1 ] == '0' ) a[ n = 1 ] = 0 ; else n = 0 ;

    for ( int i = len ; i > 0 ; i -= maxb ) {

        val = 0 ;

        if ( i >= maxb ) REP( j , ( i - maxb + 1 ) , i ) val = val * 10 + s[ j ] - '0'

        ; else rep( j , i ) val = val * 10 + s[ j ] - '0' ;

        a[ ++ n ] = val ;

    }

}

 

inline void write(  ) {

    printf( "%d" , a[ n ] ) ;

    DOWN( i , ( n - 1 ) , 1 ) {

        REP( j , 1 , ( maxb - 1 ) ) if ( a[ i ] <= p[ j ] ) printf( "0" ) ;

        printf( "%d" , a[ i ] ) ;

    }

    printf( "\n" ) ;

}

 

inline int cmp( const bignum &x ) {

    if ( n > x.n ) return 1 ; else if ( n < x.n ) return - 1 ;

    DOWN( i , n , 1 ) {

        if ( a[ i ] > x.a[ i ] ) return 1 ; else if ( a[ i ] < x.a[ i ] ) return - 1 ;

    }

    return 0 ;

}

 

inline void div2(  ) {

    DOWN( i , n , 1 ) {

        a[ i - 1 ] += ( a[ i ] & 1 ) * p[ maxb ] ; a[ i ] >>= 1 ;

    }

    if ( n > 1 && ! a[ n ] ) -- n ;

}

 

inline void mul2(  ) {

    rep( i , n ) a[ i ] <<= 1 ;

    rep( i , n ) if ( a[ i ] >= p[ maxb ] ) {

        a[ i + 1 ] += a[ i ] / p[ maxb ] ; a[ i ] %= p[ maxb ] ;

    }

    n += ( a[ n + 1 ] > 0 ) ;

}

 

inline void dec( const bignum &x ) {

    rep( i , n ) {

        for ( ; a[ i ] < x.a[ i ] ; a[ i ] += p[ maxb ] , -- a[ i + 1 ] ) ;

        a[ i ] -= x.a[ i ] ;

    }

    DOWN( i , n , 1 ) if ( a[ i ] ) {

        n = i ; break ;

    }

}

 

inline bool odd(  ) {

    return a[ 1 ] & 1 ;

}

 

inline bool check(  ) {

    return a[ 1 ] == 0 && n == 1 ;

}

} n1 , n2 , ans , temp ;

int cnt = 0 ;

int main( ) {

INIT(  ) ; n1.read(  ) ; n2.read(  ) ;

if ( n1.check(  ) ) {

    n2.write(  ) ; return 0 ;

}

if ( n2.check(  ) ) {

    n1.write(  ) ; return 0 ;

}

for ( int rec = n1.cmp( n2 ) ; rec ; rec = n1.cmp( n2 ) ) {

    if ( n1.odd(  ) ) {

        if ( n2.odd(  ) ) {

            if ( rec == 1 ) n1.dec( n2 ) ; else n2.dec( n1 ) ;

        } else n2.div2(  ) ;

    } else {

        if ( n2.odd(  ) ) n1.div2(  ) ; else ++ cnt , n1.div2(  ) , n2.div2(  ) ;

    }

}

ans = n1 ;

while ( cnt -- ) ans.mul2(  ) ;

ans.write(  ) ;

return 0 ;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容