O(1)gcd学习笔记
设最大权值为\(M\)
\(T=\sqrt M\)
定理
任意一个\(\le M\)的数一定可以表示为abc三个数的乘积
满足这三个数要么\(\le T\),要么是一个质数
证明:
考虑反证
假设\(a>b>c\),满足\(a>T\)且\(a\)不为素数
因为\(a>T\)且\(abc\le M\),则有\(bc\le T\)
我们设\(a=x*y\),一定不可能x,y均\(\ge T\)
假设\(x>y\),则\(y \le T\)
则原数可表示为\(x,y,bc\)三数乘积
若此时x仍不满足两条件之一,继续分解,最后定能满足
预处理O(n)
线性筛,求出每个数的最小质因子
预处理每个数能分解成哪三个数
对于x,其最小质因数为p
则x的分解先复制\(x/p\)的分解
设为a,b,c
若\(a*p\le T\)则\(a*=p\)
若\(b*p\le T\)则\(b*=p\)
否则\(c*=p\)
正确性证明:
不难发现若\(p\ge T\)则x为素数且x=p
而对于x为素数的,\(x/p=1\)显然正确,不用考虑
那么此时\(p\le T\)
若a,b,c其一为1,显然正确,不用考虑
此时有\(a*p,b*p,c*p\)均为合数
所以:现在要证明的是\(a,b,c\)中至少有一个数乘\(p\)后\(\le T\)
就是证明\(a,b,c\)中不会出现每一个数乘\(p\)都\(\ge T\)
反证:
根据条件有\(a,b,c>\frac T p\)
设\(x/p\)的最小质因数为w,则\(w\ge p\)
依此类推\(a,b,c\ge p\)
①\(p< \sqrt T\),此时\(a,b,c>\sqrt T\)
\(pabc>\frac {T^3} {p^2}>{T^2}=M\)
说明原数在权值范围M之外,矛盾
②\(p\ge \sqrt T\),
此时\(pabc>p^4>T^2=M\)预处理T以内两两数的gcd
可以递推,像辗转相除,g[x][y]=g[y][x%y]
Code
void init_gcd(){
notprime[1]=1;
int i,j,d;
for(i=2;i<N;i++){
if(!notprime[i]){
prime[++cnt]=i;
p[i]=i;
}
for(j=1;j<=cnt;j++){
if((LL)prime[j]*i>=N) break;
d=prime[j]*i;
notprime[d]=1;
p[d]=prime[j];
if(i%prime[j]==0) break;
}
}
split[1][0]=split[1][1]=split[1][2]=1;
for(i=2;i<N;i++){
memcpy(split[i],split[i/p[i]],sizeof(split[i/p[i]]));
if(split[i][0]*p[i]<=sn) split[i][0]*=p[i];
else if(split[i][1]*p[i]<=sn) split[i][1]*=p[i];
else split[i][2]*=p[i];
}
// gcd(0,0)=0 , gcd(0,x)=x
for(i=0;i<=sn;i++)
for(j=0;j<=i;j++){
if(!i||!j) g[i][j]=i|j;
else g[i][j]=g[j][i]=g[j][i%j];//j<=i
}
}
求两数gcd O(1)
int gcd(int x,int y){
int ans=1,i,d;
for(i=0;i<3;i++){
if(split[x][i]<=sn) d=g[split[x][i]][y%split[x][i]];
else d=(y%split[x][i]==0)?split[x][i]:1;
ans*=d;
y/=d;//避免算重
}
return ans;
}
O(1)gcd学习笔记的更多相关文章
- iOS多线程之GCD学习笔记
什么是GCD 1.全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 2.纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 G ...
- 多线程-GCD学习笔记
********************************* 基本概念 *********************************** 1. Grand Central Dispatch ...
- stein法求gcd 学习笔记
原理显然 由于当x,y都为奇数时进行辗转相见 每次减完必有偶数 而偶数最多除log次 那么也最多减log次 复杂度有保证 注:代码未验证 int gcd(int x,int y){ int res=1 ...
- 最大公约数GCD学习笔记
引理 已知:k|a,k|b 求证:k|(m*a+n*b) 证明:∵ k|a ∴ 有p*k=a 同理可得q*k=b ∴ p*k*m=m*a,q*k*n=n*b ∴ k(p*m+q*n)=m*a+n*b ...
- iOS GCD学习笔记
// 后台执行: dispatch_async(dispatch_get_global_queue(, ), ^{ // something }); // 主线程执行: dispatch_async( ...
- RAC学习笔记
RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
随机推荐
- JavaScript设置div中的文字滚动起来 实现滚动效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mysql--数据定义语言(DDL)
DDL(Data Definition languages)数据定义语言,这些语句主要定义了不同的数据段,数据表.列.索引等操作,主要关键字有create.drop.alter. 一. 数据库的操作 ...
- Mysql--7种Join查询
0.sql的执行顺序 手写顺序 机读顺序 总结 ①From:对from左边的表和右边的表计算笛卡尔积,产生虚拟表c1 ②On:对c1中的数据进行on过滤,只有符合过滤条件的数据记录才会记录在虚拟表c2 ...
- 【PHP】什么时候使用Try Catch(转)
几条建议: 如果无法处理某个异常,那就不要捕获它. 如果捕获了一个异常,请不要胡乱处理它. 尽量在靠近异常被抛出的地方捕获异常. 在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出. 按 ...
- ZendFramework-2.4 源代码 - 整体架构(类图)
- U盘装系统之winpe中常用安装win7的方法和备份(2013-01-15-bd 写的日志迁移
首先到网上去下一个制作U盘启动的的软件比如老毛桃.大白菜.电脑城制作u盘启动软件[其实他们的装机界面和工具那些都差不多], 我是用的老毛桃至于制作流程你可以看它的视频你往下拉就可以看见,或者看说明,自 ...
- 传智 杨中科老师 ASP.NET 笔记
- JVM——自定义类加载器
)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理.这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着 ...
- 倍增 - 强制在线的LCA
LCA 描述 给一棵有根树,以及一些询问,每次询问树上的 2 个节点 A.B,求它们的最近公共祖先. !强制在线! 输入 第一行一个整数 N. 接下来 N 个数,第 i 个数 F i 表示 i 的父亲 ...
- Java之OutOfMemoryError简单分析
Java之OutOfMemoryError简单分析 最近编码遇到了Java内存溢出的问题,所以就想顺便总结一下几种导致Java内存溢出的栗子,以及碰到Java内存溢出要如何去解决. Java堆溢出 J ...