给出一个正整数n(1<=n<=231-1),求当x,y都为正整数,方程sqrt(n)=sqrt(x)-sqrt(y);的解中,x的最小值是多少?
【输入格式】
一行,一个整数。
【输出格式】
一行,一个满足条件的最小的x的解。
【输入样例】
4
【输出样例】
9
算法分析1:任何一个正整数n一定能表示成n=p1a1×p2a2 × ……× pkak的形式,其中pi是质数且pi<pj,ai是大于0的正整数。
因此将给定的n通过分解质因子得到的上面的形式,要保证n×y是完全平凡数且n×y最小,就必须把n的质因子的奇次幂加1使其换成偶次幂,也就是解出一个最小的y,使n×y成为完全平方数,通过上述分析y=(p1a1%2)×(p2a2%2)×……×(pkak%2),这就是可以使y最小。
算法的时间复杂度主要取决对n的质因数分解的代价,预处理sqrt(231)以内的质数,这样便于对n的质因数分解。
进一步思考算法2:例如当n=288,把n质因子分解后得288=25×32=24×32×2,在乘上最小的y即2得到24×32×22,就是一个完全平方数,按照这个思路,要把n写成两部分相乘式,一部分是已经完全平方数形式用p2表示,另一部分用q表示,即n=p2×q,y=q;得
x=n+y+2×sqrt(n×y)=(p+1)×(p+1)×q;只需要y最小的q。即枚举p,根据n=p2×q,求出最小的q和对应的p从而求出x即可。
#include<iostream>
#include<math.h>
using namespace std;
long long n,t