[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, ...
随机推荐
- APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows
APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows iTunes 12.9.4 for Windows is now available and addres ...
- 初步认识Promise
在解释什么是Promise之前,先看一道练习题,做完练习题也就知道Promise到底是干嘛用的了. 假设现在有个需求:你要封装一个方法,我给你一个要读取文件的路径,你这个方法能帮我读取文件,并把内容返 ...
- 算法时间计算:logA(N)与O(n)
算法运行时间估算常见O(log(n))log:求对数例:a^b=na为底数,b为n的对数记作:logA(n)=b ->求N的对数 计算器验算:计算器的log默认以10为底 输入 10,log ...
- luogu P5300 [GXOI/GZOI2019]与或和
传送门 题目涉及按位与以及按位或运算,所以可以拆位考虑,枚举某个二进制位,然后某个位置如果那个数的第\(i\)位是\(0\)就放\(0\),否则放\(1\),这一位的贡献就是位运算后值为\(1\)的子 ...
- JAVA进阶10
间歇性混吃等死,持续性踌躇满志系列-------------第10天 1.Random package cn.intcast.day08.demo01; import java.util.Random ...
- 新手入门django本地化服务
自动化安装 #更新依赖库 pip install --upgrade setuptools #安装指定的版本 pip install Django==2.0.4 文 ...
- Xpath初了解
如下一段html: <html> <body> <form id="loginForm"> <input name="usern ...
- Centos6.X搭建Squid为YUM做代理
1.在能联网的机器上安装 Squid yum install squid 2.配置squid vi /etc/squid/squid.conf 编辑内容如下: http_port cache_mem ...
- AOP注解使用详解
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点, ...
- SpringBoot配置
多模块Maven项目 .gitignore文件 .idea *.iml targetout log tmp test 父模块pom文件 <?xml version="1.0" ...