bzoj1876 [SDOI2009]SuperGCD 辗转相减+高精
这个题是给有数竞基础的人出的吧,不然没法做
辗转相减法+优化,这个题卡时,要压1000
注:
1、赋值顺序
2、特判
3、手残
码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a[10005],b[10005],la,lb,i,j,jw,ans[10005],daan[10005];
char ca[10005],cb[10005];
int main()
{ans[0]=ans[1]=1;scanf("%s",ca+1);scanf("%s",cb+1);int la=strlen(ca+1);int lb=strlen(cb+1);while(la>=1){a[++a[0]]=ca[la]-'0';la--;if(la==0)break;a[a[0]]+=(ca[la]-'0')*10;la--;if(la==0)break;a[a[0]]+=(ca[la]-'0')*100;la--;}while(lb>=1){b[++b[0]]=cb[lb]-'0';lb--;if(lb==0)break;b[b[0]]+=(cb[lb]-'0')*10;lb--;if(lb==0)break;b[b[0]]+=(cb[lb]-'0')*100;lb--;} while(1){ if(a[0]<b[0])swap(a,b);else for(i=a[0];i>=1;i--) //比大小 if(a[i]>b[i]){break;}else if(a[i]<b[i]){swap(a,b);break;}if(b[0]==1&&b[1]==0)break; int cnt=0;if(a[1]%2==0){cnt++;for(i=a[0];i>=1;i--){a[i]+=jw*1000;jw=a[i]%2;a[i]=a[i]/2;}while(a[a[0]]==0)a[0]--; }if(b[1]%2==0){++cnt;for(i=b[0];i>=1;i--){b[i]+=jw*1000;jw=b[i]%2;b[i]=b[i]/2;}while(b[b[0]]==0)b[0]--;}if(cnt==2){for(i=1;i<=ans[0];i++){int o=jw+ans[i]*2;ans[i]=o%1000;jw=o/1000;} while(jw)ans[++ans[0]]=jw%1000,jw/=1000;}if(cnt==0){for(i=a[0];i>=1;i--){if(a[i]<b[i])a[i+1]-=1,a[i]+=1000;a[i]=a[i]-b[i];}while(a[a[0]]==0&&a[0]!=1)a[0]--;}}daan[0]=a[0]+ans[0]-1;
for(i=1;i<=a[0];i++)
for(j=1;j<=ans[0];j++)
{daan[i+j-1]+=ans[j]*a[i];
}
for(i=1;i<=daan[0];i++)
{
int o=daan[i]+jw;
jw=o/1000;
daan[i]=o%1000;}
while(jw)daan[++daan[0]]=jw%1000,jw/=1000;
for(i=daan[0];i>=1;i--)
{
if(daan[i]>=100||daan[0]==i)printf("%d",daan[i]);else if(daan[i]>=10)printf("0%d",daan[i]);else printf("00%d",daan[i]);
}
}
bzoj1876 [SDOI2009]SuperGCD 辗转相减+高精相关推荐
- BZOJ1876 [SDOI2009]SuperGCD 【高精 + GCD优化】
题目 Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比 赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但 ...
- BZOJ1876:[SDOI2009]SuperGCD 高精度+更相减损法
更相减损法:gcd(a,b)=gcd(a/2,b/2)∗2gcd(a,b)=gcd(a/2,b/2)∗2gcd(a,b) = gcd(a/2, b/2)*2 当a,b均为偶数 gcd(a,b)=gcd ...
- BZOJ1876 SDOI2009 SuperGCD 其他
题意:求两个大正整数的GCD 题解: 出题人的愿意肯定是觉得SDOI不出大模拟说不过去,嘛,考场上这么出肯定没问题 不过BZOJ允许使用Python就是个错误-- a=(int)(input()) b ...
- 【C/C++】最大公约数和最小公倍数(辗转相除、更相减损、stein)
一.最大公约数和最小公倍数 数学性质: 如果b是A和B的公约数,那么:b也是A+B的约数,即b是A,B,A+B的公约数.b也是A-B的约数,即b是A,B,A-B的公约数.更一般地,对于任意整数x.y, ...
- [Luogu1891]疯狂LCM[辗转相减法]
题意 多组询问,每次给定 \(n\) ,求:\(\sum_{i=1}^nlcm(i,n)\) . \(\rm T \leq 3\times 10^4\ ,n \leq 10^6\). 分析 推式子: ...
- 最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂
文章目录 前言 一.名称定义 1.最大公约数 2.辗转相除法 3.更相减损法 二.ACM杭电入门题 1.解题思路 三.解题参考代码(C语言,C++) 0.最优算法(C++) 1.辗转相除求解(C语言) ...
- C++算法:辗转相除法与更相减损术
辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...
- 更相减损术程序设计c语言,更相减损术
本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合 ...
- 求最大公约数(更相减损术辗转相除法)
求解最大公约数的多种Way: 1 暴力解决法:M不断自减找到最大公约数. 2 辗转相除法:反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数. 3 更相减损术:若两者都为偶数,进行折半,直到 ...
最新文章
- 前端分离的前端开发工具_使我成为前端开发人员工作的工具和资源
- Facebook开源算法代码库,轻松复现前沿视频理解模型
- 关于「Xception」和「DeepLab V3+」的那些事
- boost::mpi模块is_mpi_op 功能的测试
- javasript --- 一个日期规范(x秒前,x分前...)
- 日发帖 发帖频率 发帖时段_先发帖
- OpenCV 像素的读取与操作
- 百度Apollo无人驾驶路测更进一步 李彦宏感慨:终于可以不用安全员了
- linux noprobe参数,find 命令的参数详解
- ubuntu 安装docker
- PXE环境下安装系统(DHCP+TFTP+HTTP+kickstart)
- 开放 接口 饿了么_饿了么口碑启动生态赋能计划 将在210城开放智慧餐厅业务合作窗口...
- 遥控器鼠标模式切换 android 4.4
- 什么是php 开发,php开发是什么?
- 亲测可行ie8与ie11共存方法支持win7x64等
- Android N开发者预览版(第二版)发布
- 几个实用的app和网站
- MySQL简介以及简单的下载和安装
- Android Manifest
- 【Chips】跨时钟域的亚稳态处理、为什么要打两拍不是打一拍、为什么打两拍能有效?