解方程
給出一個(gè)正整數(shù)n(1<=n<=231-1),求當(dāng)x,y都為正整數(shù),方程sqrt(n)=sqrt(x)-sqrt(y);的解中,x的最小值是多少?
【輸入格式】
一行,一個(gè)整數(shù)。
【輸出格式】
一行,一個(gè)滿足條件的最小的x的解。
【輸入樣例】
4
【輸出樣例】
9
算法分析1:任何一個(gè)正整數(shù)n一定能表示成n=p1a1×p2a2 × ……× pkak的形式,其中pi是質(zhì)數(shù)且pi<pj,ai是大于0的正整數(shù)。
因此將給定的n通過分解質(zhì)因子得到的上面的形式,要保證n×y是完全平凡數(shù)且n×y最小,就必須把n的質(zhì)因子的奇次冪加1使其換成偶次冪,也就是解出一個(gè)最小的y,使n×y成為完全平方數(shù),通過上述分析y=(p1a1%2)×(p2a2%2)×……×(pkak%2),這就是可以使y最小。
算法的時(shí)間復(fù)雜度主要取決對(duì)n的質(zhì)因數(shù)分解的代價(jià),預(yù)處理sqrt(231)以內(nèi)的質(zhì)數(shù),這樣便于對(duì)n的質(zhì)因數(shù)分解。
進(jìn)一步思考算法2:例如當(dāng)n=288,把n質(zhì)因子分解后得288=25×32=24×32×2,在乘上最小的y即2得到24×32×22,就是一個(gè)完全平方數(shù),按照這個(gè)思路,要把n寫成兩部分相乘式,一部分是已經(jīng)完全平方數(shù)形式用p2表示,另一部分用q表示,即n=p2×q,y=q;得
x=n+y+2×sqrt(n×y)=(p+1)×(p+1)×q;只需要y最小的q。即枚舉p,根據(jù)n=p2×q,求出最小的q和對(duì)應(yīng)的p從而求出x即可。
該算法是從小到大枚舉p,直到p×p>n時(shí),q為最小從大到小枚舉p,那么第一個(gè)滿足n%p×p=0的p對(duì)應(yīng)q肯定是最小,這樣就可以停止枚舉了,在多數(shù)情況下該算法比小到大枚舉p的算法效率高。
#include<iostream> #include<math.h> using namespace std;long long n,q,x; int p; int main() {cin>>n;for(p=sqrt(n);p>=1;--p){if(n%(P*P)==0){q=n/(p*p);break;}}x=(p+1)*(p+1)*q;cout<<x<<"\n";return 0; }總結(jié)
- 上一篇: Riak - 背景篇(3)
- 下一篇: stm32点亮LED的有关寄存器配置CR