[SDOI2009]SuperGCD
这题。高精度。恶心。难受。
那么高精度的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的更多相关文章
- BZOJ 1876: [SDOI2009]SuperGCD
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3060 Solved: 1036[Submit][St ...
- bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
1876: [SDOI2009]SuperGCD Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2384 Solved: 806[Submit][Sta ...
- BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )
更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...
- 【BZOJ1876】[SDOI2009]SuperGCD(数论,高精度)
[BZOJ1876][SDOI2009]SuperGCD(数论,高精度) 题面 BZOJ 洛谷 题解 那些说数论只会\(gcd\)的人呢?我现在连\(gcd\)都不会,谁来教教我啊? 显然\(gcd\ ...
- [BZOJ1876][SDOI2009]superGCD(高精度)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1876 分析: 以为辗转相减会TLE呢……但是好像没这个数据……就这么水过去了…… 辗转 ...
- bzoj1876: [SDOI2009]SuperGCD
更相减损数. 上手就debug了3个小时,直接给我看哭了. 3个函数都写错了是什么感受? 乘2函数要从前往后乘,这样后面的数乘2进位以后不会干扰前面的数. 除2函数要从后往前除,这样前面的数借来的位不 ...
- bzoj千题计划288:bzoj1876: [SDOI2009]SuperGCD
http://www.lydsy.com/JudgeOnline/problem.php?id=1876 高精压位GCD 对于 GCD(a, b) a>b 若 a 为奇数,b 为偶数,GCD ...
- 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 ...
- [BZOJ1877][SDOI2009]SuperGCD
题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...
随机推荐
- RoIPooling
. 代码: template <typename Dtype> void ROIPoolingLayer<Dtype>::Forward_cpu(const vector< ...
- 基于STM32F1的时钟芯片DS1302驱动
目录 DS1302.h源代码 DS1302.c源代码 DS1302.h源代码 /** ********************************************************* ...
- js中split 正则表示式 (/[,+]/)
定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) separator 作为分隔符,separator ...
- 学习pano2vr制作html5全景笔记
demo截图: demo下载: 百度网盘:http://pan.baidu.com/s/1o8yBwIA 密码:nf62(启服务端查看); 我制作是全屏定点360的全景页面,使用pano2vr软件制作 ...
- OpenCV中Mat总结
一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...
- 【原创】大数据基础之ElasticSearch(3)升级
elasticsearch版本升级方案 常用的滚动升级过程(Rolling Upgrade)如下: $ curl -XPUT '$es_server:9200/_cluster/settings?pr ...
- 【原创】大叔经验分享(5)oozie提交spark任务如何添加依赖
spark任务添加依赖的方式: 1 如果是local方式运行,可以通过--jars来添加依赖: 2 如果是yarn方式运行,可以通过spark.yarn.jars来添加依赖: 这两种方式在oozie上 ...
- Django-DRF-图书增删改查 !!!
自己封装的 class MyResponse(): def __init__(self): self.status = 100 self.msg = None @property def get_ ...
- python计算文件的行数的方法
1.简单方法把文件读入一个大的列表中,然后统计列表的长度. count = len(open("文件名").readlines()) print count 2.读取文件某一行 ...
- 批量执行 sql 的 shell 脚本
最近有用到需要批量导入N个表的sql,一个个导入会吐老血的,写了个shell脚本,便捷导入. 通常我们导入单个sql,可以用 $mysql -uroot -p world < xxxx.sql ...