博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1876 高精
阅读量:6443 次
发布时间:2019-06-23

本文共 4743 字,大约阅读时间需要 15 分钟。

 

  首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论

  当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b)

  当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b div 2)

  当a为偶数,b为偶数的时候gcd(a,b)=2*gcd(a div 2,b div 2)

  当a为奇数,b为奇数的时候,根据欧几里德定律,有gcd(a,b)=gcd(a-b,b) (a>b)时

  那么这道题就变成了不断地缩小a,b的范围了。直接高精就行了。当然数据为1,10^1000的时候会tle,题目比较良心没有这样的数据。

 

高精写渣了。

/**************************************************************    Problem: 1876    User: BLADEVIL    Language: Pascal    Result: Time_Limit_Exceed****************************************************************/ //By BLADEVILvar    s1, s2                      :ansistring;    f1, f2                      :boolean;    ans                         :ansistring;    a, b, c                     :array[0..100000] of longint;    i                           :longint;    doit                        :longint;      function max(s1,s2:ansistring):boolean;begin    if length(s1)>length(s2) then exit(true);    if (length(s1)=length(s2)) and (s1>s2) then exit(true);    exit(false);end;      function divid(s:ansistring):ansistring;var    i                           :longint;    len                         :longint;    ss                          :ansistring;begin    fillchar(a,sizeof(a),0);    len:=length(s);    for i:=1 to len do a[(len-i) div 7+1]:=a[(len-i) div 7+1]*10+ord(s[i])-48;    len:=(len+6) div 7;    for i:=len downto 2 do        if a[i] mod 2=0 then            a[i]:=a[i] div 2 else            begin                a[i]:=a[i] div 2;                a[i-1]:=a[i-1]+10000000;            end;    a[1]:=a[1] div 2;    divid:='';    for i:=len downto 1 do    begin        str(a[i],ss);        if a[i]<1000000 then divid:=divid+'0';        if a[i]<100000 then divid:=divid+'0';        if a[i]<10000 then divid:=divid+'0';        if a[i]<1000 then divid:=divid+'0';        if a[i]<100 then divid:=divid+'0';        if a[i]<10 then divid:=divid+'0';        divid:=divid+ss;    end;    while (divid[1]='0') and (length(divid)>1) do delete(divid,1,1);end;  function jian(s1,s2:ansistring):ansistring;var    len1, len2                  :longint;    ss                          :ansistring;    i                           :longint;begin    fillchar(a,sizeof(a),0);    fillchar(b,sizeof(b),0);    fillchar(c,sizeof(c),0);    len1:=length(s1);    for i:=1 to len1 do a[(len1-i) div 7+1]:=a[(len1-i) div 7+1]*10+ord(s1[i])-48;    len2:=length(s2);    for i:=1 to len2 do b[(len2-i) div 7+1]:=b[(len2-i) div 7+1]*10+ord(s2[i])-48;    len1:=(len1+6) div 7;    len2:=(len2+6) div 7;    for i:=1 to len1 do    begin        c[i]:=c[i]+a[i]-b[i];        if c[i]<0 then        begin            c[i]:=c[i]+10000000;            c[i+1]:=c[i+1]-1;        end;    end;    jian:='';    for i:=len1 downto 1 do    begin        str(c[i],ss);        if c[i]<1000000 then jian:=jian+'0';        if c[i]<100000 then jian:=jian+'0';        if c[i]<10000 then jian:=jian+'0';        if c[i]<1000 then jian:=jian+'0';        if c[i]<100 then jian:=jian+'0';        if c[i]<10 then jian:=jian+'0';        jian:=jian+ss;    end;    while (jian[1]='0') and (length(jian)>1) do delete(jian,1,1);end;  function mul(s:ansistring):ansistring;var    len                         :longint;    i                           :longint;    ss                          :ansistring;begin    len:=length(s);    fillchar(a,sizeof(a),0);    for i:=1 to len do a[(len-i) div 7+1]:=a[(len-i) div 7+1]*10+ord(s[i])-48;    len:=(len+6) div 7;    for i:=1 to len do a[i]:=a[i]*2;    for i:=1 to len do    begin        a[i+1]:=a[i+1]+a[i] div 10000000;        a[i]:=a[i] mod 10000000;    end;    inc(len);    mul:='';    for i:=len downto 1 do    begin        str(a[i],ss);        if a[i]<1000000 then mul:=mul+'0';        if a[i]<100000 then mul:=mul+'0';        if a[i]<10000 then mul:=mul+'0';        if a[i]<1000 then mul:=mul+'0';        if a[i]<100 then mul:=mul+'0';        if a[i]<10 then mul:=mul+'0';        mul:=mul+ss;    end;    while (mul[1]='0') and (length(mul)>1) do delete(mul,1,1);end;      begin    readln(s1);    while (s1[1]='0') and (length(s1)>1) do delete(s1,1,1);    readln(s2);    while (s2[1]='0') and (length(s2)>1) do delete(s2,1,1);    doit:=0;    while s1<>s2 do    begin        if ord(s1[length(s1)]) mod 2=0 then f1:=true else f1:=false;        if ord(s2[length(s2)]) mod 2=0 then f2:=true else f2:=false;        if f1 and f2 then        begin            s1:=divid(s1);            s2:=divid(s2);            inc(doit);        end else        begin            if f1 then s1:=divid(s1);            if f2 then s2:=divid(s2);            if (not f1) and (not f2) then                if max(s1,s2) then s1:=jian(s1,s2) else s2:=jian(s2,s1);        end;    end;    ans:=s1;    for i:=1 to doit do ans:=mul(ans);    writeln(ans);end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3517585.html

你可能感兴趣的文章
Linq Like
查看>>
Linux知识积累(4) Linux下chkconfig命令详解
查看>>
centos关机与重启命令
查看>>
[Eth]Mac/Phy/mdio/Rgmii
查看>>
C++中的函数指针和函数对象总结
查看>>
ELK学习总结(3-2)elk的过滤查询
查看>>
快速定位oracle故障-恩墨
查看>>
Redis可视化工具 Redis Desktop Manager
查看>>
Go基础系列:为select设置超时时间
查看>>
Android网络请求之OkHttp框架
查看>>
《Apache Kafka实战》读书笔记-调优Kafka集群
查看>>
小程序开发事项
查看>>
福利 | 2018各大技术大会资料汇总(可下载)
查看>>
寻找下一代CTO - 激发潜能把握成功!!
查看>>
用DELPHI 开发压缩、解压、自解压、加密
查看>>
Linux命令行得到系统IP
查看>>
SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
查看>>
python类型转换、数值操作(收藏)
查看>>
mysql delimiter
查看>>
关于C#静态构造函数的几点说明
查看>>