bool gcd(int a,int b){
if(a==1||b==1)return true;
if(b==0)return false;
return helper1(b,a%b);
}
给定N和K,求互不相同的正整数x,y,z使得x+y+z=N,且gcd(x,y)=gcd(x,z)=gcd(y,z)=K。
条件:1 ≤N, K≤ 1e18
思路:等式两边除K,得到x'+y'+z'=N'=N/K,且x',y',z'两两互素。
当N'为偶数,直接构造x'=1, y'=N'/2, z' = y'-1满足条件。
当N'为奇数,另x'=1,则y'+z'=N'-1。由于N'-1为偶数且y'和z'互素,必然有y',z'都为奇数。令y'=3,5,..., N' / 2逐个搜索即可。
在这里讨论一下N'为奇数时搜索的复杂度。
考虑奇素数pi,如果y'=pi不满足条件,那么必然有z'与pi不互素,也就是pi整除z',从而pi整除pi+z'=N'-1
考虑y'为前15个奇素数p1,...,p15。如果均不满足条件,那么他们的乘积p1p2...p15也整除N'-1。考虑到前15个奇素数的积已经超过了1e18,矛盾。
因此我们搜索到第15个奇素数(53)的时候一定能找到一对满足条件的y'和z'。因此搜索复杂度为O(p15)=O(1)。
作者:tuogy
链接:https://www.nowcoder.com/discuss/455801
来源:牛客网
<