题目链接

这题。高精度。恶心。难受。

那么高精度的gcd怎么做呢?

若a=b gcd(a,b)=a

①a偶b偶 gcd(a,b)=2*gcd(a/2,b/2)

②a偶b奇 gcd(a,b)=gcd(a/2,b)

③a奇b奇 gcd(a,b)=gcd(a-b,b)

嗯。这玩意就这样了。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int a[],b[],c[],f[],s0,T,kpl[],kyl;
char s[];
void bigscanf(int *a){
scanf("%s",s);
int len=strlen(s),i,j;
for(i=;i<len;++i){
j=(len-i+)/;
a[j]=a[j]*+s[i]-'';
}
a[]=(len+)/;
}
void bigprintf(int *a){
cout<<a[a[]];
for(int i=a[]-;i>;--i){
for(int j=;j>;j/=)cout<<a[i]/j%;
}
cout<<endl;
}
int bigcmp(int *a,int *b){
if(a[]>b[])return ;
if(a[]<b[])return -;
for(int i=a[];i>;i--){
if(a[i]>b[i])return ;
if(a[i]<b[i])return -;
}
return ;
}
void bigsub(int *a,int *b){
int k=a[],g=;
for(int i=;i<=k;i++){
a[i]=a[i]-b[i];
if(a[i]<){
a[i+]--;
a[i]=a[i]+;
}
else g=;
}
while(k>&&a[k]==)k--;
a[]=k;
}
void bigmul2(int *a,int *b,int *c){
int k=a[]+b[];
for(int i=;i<=a[];i++){
for(int j=;j<=b[];j++){
c[i+j-]=c[i+j-]+a[i]*b[j];
c[i+j]=c[i+j]+c[i+j-]/;
c[i+j-]=c[i+j-]%;
}
}
while(k>&&c[k]==)k--;
c[]=k;
}
void bigmul1(int *a,int b){
int k=a[],g=;
for(int i=;i<=a[];i++){
a[i]=a[i]*b+g;
g=a[i]/;
a[i]=a[i]%;
}
while(g>){
k++;
a[k]=g%;
g=g/;
}
while(k>&&a[k]==)k--;
a[]=k;
}
void bigdiv1(int *a,int b){
int k=a[],d=;
for(int i=a[];i>=;i--){
d=d*+a[i];
a[i]=d/b;
d=d%b;
}
while(k>&&a[k]==)k--;
a[]=k;
}
void copy(int *a,int *b){
for(int i=;i<=b[];++i){
a[i]=b[i];
}
}
void Gcd(int *a,int *b,int t){
int u=bigcmp(a,b);//cout<<u<<endl;
if(u==){T=t;return;}
if(u<){Gcd(b,a,t);return;}
int ta=,tb=;
if(a[]%==){
bigdiv1(a,);
ta=;
}
if(b[]%==){
bigdiv1(b,);
tb=;
}
if(ta&&tb)Gcd(a,b,t+);
else if(! ta&&! tb){bigsub(a,b);Gcd(a,b,t);}
else Gcd(a,b,t);
}
int main(){
bigscanf(a);
bigscanf(b);
Gcd(a,b,);
if(T==)bigprintf(a);
else {
f[]=f[]=;
for(int i=;i<=T;i++)bigmul1(f,);
bigmul2(f,a,kpl);
copy(f,kpl);
bigprintf(f);
}
return ;
}

[SDOI2009]SuperGCD的更多相关文章

  1. BZOJ 1876: [SDOI2009]SuperGCD

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3060  Solved: 1036[Submit][St ...

  2. bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2384  Solved: 806[Submit][Sta ...

  3. BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )

    更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...

  4. 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)

    [BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...

  5. [BZOJ1876][SDOI2009]superGCD(高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...

  6. bzoj1876: [SDOI2009]SuperGCD

    更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...

  7. bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于  GCD(a, b)  a>b 若 a 为奇数,b 为偶数,GCD ...

  8. P2152 [SDOI2009]SuperGCD 未完成

    辗转相减求a,b的gcd其实可以优化的: 1.若a为偶数,b为奇数:gcd(a,b)=gcd(a/2,b) 2.若a为奇数,b为偶数:gcd(a,b)=gcd(a,b/2) 3.若a,b都是偶数:gc ...

  9. [BZOJ1877][SDOI2009]SuperGCD

    题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...

随机推荐

  1. Mysql中设置指定IP的特定用户及特定权限

    创建用户:格式:grant select on 数据库.* to 用户名@登录主机 identified by '密码' 举例: 例 1:增加一个用户 test1 密码为 abc,让他可以在任何主机上 ...

  2. Angular笔记-select

    --select-- 设置默认选中值方法: <select ng-model="url" ng-options="x.url as x.site for x in ...

  3. 【原创】大叔经验分享(12)如何程序化kill提交到spark thrift上的sql

    spark 2.1.1 hive正在执行中的sql可以很容易的中止,因为可以从console输出中拿到当前在yarn上的application id,然后就可以kill任务, WARNING: Hiv ...

  4. 绝对定位下margin的作用

    以前一直对绝对定位下的margin作用很模糊,今天细看一下 不使用top,left,margin等 <!DOCTYPE html> <html lang="en" ...

  5. 九.LNMP网站架构实践部署

    期中集群架构-第九章-期中架构LNMP章节====================================================================== 01. LNMP ...

  6. MySql新增表的字段,删除表字段

    1增加两个字段: create table id_name(id int,name varchar(20));//创建原始数据表 alter table id_name add age int,add ...

  7. 关于在windows上远行的虚拟机为ubuntu16.04中不能复制和粘贴的问题解决方案

    Linux安装 VMware tools 工具解决复制和粘贴的方法 VMware虚拟机中如何安装VMWare-Tools详解好处:可以支持图形界面,可以支持共享文件功能等 1 工具/原料 1)安装过虚 ...

  8. matplotlib坐标轴设置-【老鱼学matplotlib】

    我们可以对坐标轴进行设置,设置坐标轴的范围,设置坐标轴上的文字描述等. 基本用法 例如: import numpy as np import pandas as pd import matplotli ...

  9. PHP unicode与普通字符串的相互转化

    unicode转字符串 方法一:json /** * unicode转字符串,通过json转化 * @param $str * @return string */ function unicode_d ...

  10. 微信小程序--家庭记账本开发--04

    界面的布局 在微信小程序开发过程中,界面的布局是十分重要的,无论是一个什么样的程序,界面的美观合理才能提供给客户一个较好的使用体验,就微信小程序布局自己看了许多小程序布局,自己将学习心得记录如下: 下 ...