题目地址:http://poj.org/problem?id=3892
给你一个数N和一个K
其中N可以被两个素数P,Q分解
加了一个条件: |q - kp| <= 105
要你求出p和q
解题思路:
题目中,q<=p且 |q - kp| <= 105
所以kp-q<=105
那么kpq-q*q<=10^5*q
因为n=pq
所以kn-q*q<=10^5*q
所以q^2>=kn-10^5*q,得到这个式子就可以看出来其实q就在sqrt(kn)附近,那么我们在他附近枚举就好了
用java就可以轻松水过了
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
/**
* @param args
*/
static BigInteger n;
static BigInteger k;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
BigInteger one = BigInteger.ONE;
BigInteger two = BigInteger.valueOf(2);
BigInteger zero = BigInteger.ZERO;
BigInteger l,r,tmp,mid;
mid=zero;
while(cin.hasNext())
{
n = cin.nextBigInteger();
k = cin.nextBigInteger();
k = k.multiply(n);
l = zero;
r = k;
while(l.compareTo(r)<=0)
{
mid = l.add(r).divide(two);
tmp = mid.multiply(mid);
if(tmp.compareTo(k) == 0)
break;
if(tmp.compareTo(k) < 0)
l=mid.add(one);
else
r=mid.subtract(one);
}
BigInteger p,q;
p = mid;
q = mid;
while(true)
{
if(n.mod(p).equals(zero) && !p.equals(one) && !p.equals(n))
{
q = n.divide(p);
break;
}
if(n.mod(q).equals(zero)&& !q.equals(one) && !q.equals(n))
{
p = n.divide(q);
break;
}
p = p.add(one);
q = q.subtract(one);
}
if(p.compareTo(q)>0)
{
tmp = p;
p = q;
q = tmp;
}
System.out.println(p+" * "+q);
}
}
}