设最大权值为\(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)

  1. 线性筛,求出每个数的最小质因子

  2. 预处理每个数能分解成哪三个数

    对于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\)

  3. 预处理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;
}

最新文章

  1. linux下文件搜索命令学习笔记
  2. 【转】Spring MVC中Session的正确用法之我见
  3. winform让子窗体始终居于父窗体的中间
  4. 夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据
  5. Cocoa Touch(一)开发基础:Xcode概念、目录结构、设计模式、代码风格
  6. Microsoft HoloLens 技术解谜(下)
  7. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大
  8. 将String转化为Long,并将Long转化为Date
  9. jQuery给table中的负数标红色
  10. 图解Tomcat
  11. expdp/impdp数据泵用法
  12. js实现进度条
  13. console命令的其他强大用法
  14. mybatis配置文件配错
  15. Myloader参数说明
  16. 力扣(LeetCode)832. 翻转图像
  17. centos7.4安装过程
  18. 将Oracle中的表结构导出到word
  19. Docker(一):入门教程
  20. modbustcp封装使用获取设备数据示例

热门文章

  1. 51nod——1285 山峰和分段(暴力出奇迹)
  2. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)
  3. 解决Linux使用php命令 -base comment not found并安装composer
  4. win7在某个盘或文件夹中出现右键只能新建文件夹的情况 (2012-12-28-bd 写的日志迁移
  5. Python9-MySQL-Homework-day43
  6. 自定义View/ViewGroup的步骤和实现
  7. Diycode开源项目 TopicContentActivity分析
  8. 纯javascript验证,100行超精简代码。
  9. Asp.net自定义控件开发任我行(8)-数据集绑定
  10. 【Best Time to Buy and Sell Stock III 】cpp