「BZOJ 1876」「SDOI 2009」SuperGCD「数论」
题意
求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\)
题解
使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法
如果不筛\(2\)因子的话复杂度是线性的,比如\(a=1,b=10^{10000}\)
再证明下更相减损术,即\(\gcd(a,b)=gcd(a-b,b)\):
假设\(d=\gcd(a,b)\),则\(a=pd,b=qd\)
根据定义可知\(\gcd(p,q)=1\)
因此\(px+qy=1\)存在解\(x,y\)
此时\(a-b=pd-q-d=(p-q)d,b=qd\)
\((p-q)x+q(x+y)=px+qy=1\)
得到\(\gcd(p-q,q)=1\),根据定义得到\(d=\gcd(a-b,b)\)
注意一下高精要压位,不然常数巨大
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
const int base = 1e9;
const int N = 1e4 + 10;
struct Int {
int len, n[N / 9 + 10];
Int() {}
Int(char * s) {
int x = strlen(s);
len = x / 9 + (x % 9 ? 1 : 0);
int p = x - 1;
for(int i = 1; i <= len; i ++) {
n[i] = 0;
for(int j = min(p, 8); j >= 0; j --)
n[i] = n[i] * 10 + (s[p - j] & 15);
p -= 9;
}
}
bool zero() { return len == 1 && n[1] == 0; }
bool judge() { return !zero() && 0 == (n[1] & 1); }
bool operator < (const Int &b) const {
if(len != b.len) return len < b.len;
for(int i = len; i >= 1; i --)
if(n[i] != b.n[i]) return n[i] < b.n[i];
return 0;
}
bool operator -= (const Int &b) {
for(int i = 1; i <= len; i ++) {
if(i <= b.len) {
n[i] -= b.n[i];
if(n[i] < 0) n[i + 1] --, n[i] += base;
}
}
for(; !n[len] && len > 1; len --);
return zero();
}
void div2() {
for(int i = 1; i <= len; i ++) {
if(n[i] & 1) n[i - 1] += base >> 1;
n[i] >>= 1;
}
for(; !n[len] && len > 1; len --);
}
void operator <<= (const int &x) {
for(int t = 1; t <= x; t ++) {
n[len + 1] = 0;
for(int i = len; i >= 1; i --) {
n[i] <<= 1; n[i + 1] += n[i] / base; n[i] %= base;
}
if(n[len + 1]) len ++;
}
this -> print();
}
void print() {
for(int i = len; i >= 1; i --)
if(i == len) printf("%d", n[i]);
else printf("%09d", n[i]);
printf("\n");
}
} x, y;
int main() {
static char A[N], B[N];
scanf("%s %s", A, B);
x = Int(A), y = Int(B);
if(x.zero()) return y.print(), 0;
if(y.zero()) return x.print(), 0;
int i = 0, j = 0;
for(; x.judge(); i ++) x.div2();
for(; y.judge(); j ++) y.div2();
while(1) {
if(!(x < y)) {
if(x -= y) return y <<= min(i, j), 0;
while(x.judge()) x.div2();
} else {
if(y -= x) return x <<= min(i, j), 0;
while(y.judge()) y.div2();
}
}
return 0;
}
「BZOJ 1876」「SDOI 2009」SuperGCD「数论」的更多相关文章
- 【BZOJ 1877】【SDOI 2009】晨跑
拆点跑$MCMF最小费用最大流$ 复习一下$MCMF$模板啦啦啦--- 一些坑:更新$dist$后要接着更新$pre$,不要判断是否在队列中再更新,,,听不懂吧,听不懂就对了,因为只有我才会在这种错误 ...
- 【BZOJ 1875】【SDOI 2009】HH去散步
水啊水,最后ans别忘了%哦! #include<cstdio> #include<cstring> #include<algorithm> using names ...
- 「SDOI 2009」Elaxia的路线
发现自己这几天智商完全不在线-- 这道题的数据十分的水,怎样都可以艹过去-- 开始想了一个完全错误的算法,枚举一对点,判断这一对点是否同时在两条最短路上,是就用两点之间的路径更新答案.显然这样是错的: ...
- 「BZOJ 4228」Tibbar的后花园
「BZOJ 4228」Tibbar的后花园 Please contact lydsy2012@163.com! 警告 解题思路 可以证明最终的图中所有点的度数都 \(< 3\) ,且不存在环长是 ...
- 「BZOJ 3645」小朋友与二叉树
「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...
- 「BZOJ 4502」串
「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段 ...
- 「BZOJ 4289」 PA2012 Tax
「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...
- 「BZOJ 2534」 L - gap字符串
「BZOJ 2534」 L - gap字符串 题目描述 有一种形如 \(uv u\) 形式的字符串,其中 \(u\) 是非空字符串,且 \(v\) 的长度正好为 \(L\), 那么称这个字符串为 \( ...
- 「BZOJ 2956」模积和
「BZOJ 2956」模积和 令 \(l=\min(n,m)\).这个 \(i\neq j\) 非常不优雅,所以我们考虑分开计算,即: \[\begin{aligned} &\sum_{i=1 ...
随机推荐
- Access 数据库的数据类型
今天开发数据库通用组件时,做C#数据库类型与Access数据库类型的相互转化时,发现Access中“text”类型的最大长度为255,当长度超过255时,需改用“Memo”类型,但需要注意备注(Mem ...
- Python not readable
try: with open('data.txt','w') as f: for each_line in f: print(each_line)except OSError as reason: p ...
- windows重启mysql命令
开始->运行->cmd 停止:net stop mysql 启动:net start mysql 前提MYSQL已经安装为windows服务
- DRF之REST规范介绍及View请求流程分析
编程是数据结构和算法的结合,而在Web类型的App中,我们对于数据的操作请求是通过url来承载的,本文详细介绍了REST规范和CBV请求流程. 编程是数据结构和算法的结合,小程序如简单的计算器,我们输 ...
- 清除stoped impdp/expdp job的方法
stoped impdp/expdp job会在dba_datapump_jobs中留下一条记录,显示为not running. 清除stopped job分两种情况: 1) job能够attach ...
- angularjs 简易模态框
angularjs 简易模态框 angularjs 中的模态框一般使用插件angular-ui-bootstrap书写. 这里记录一种简易的模态框写法: 1.警告消息框alert: 原理: 在html ...
- [原创]Mybatis特殊值Enum类型转换器-ValuedEnumTypeHandler
引言 typeHandlers 阅读官方文档 typeHandlers 一节{:target="_blank"} MyBatis 在预处理语句(PreparedStatement) ...
- 记录MongoDB常用查询
{$and:[{"}}]} // flag不等于1 也不等于0 {$or:[{"flag" :{ $ne:"1"}},{"flag" ...
- 如何使用ThinkPHP5 ,自动生成目录?
具体步骤: A.在build.php中按照实际需求修改定义模块的内容: B.修改Public/index.php,在代码中加入: // 读取自动生成定义文件 $build = include '/.. ...
- POJ1161(并查集)
1.题目链接地址 http://poj.org/problem?id=1161 2.源代码 #include <iostream> using namespace std; ]; ]; i ...