原題:
題意:
有乙個n(偶數)長的陣列,每乙個字首和都是乙個平方數,現在給出偶數字上的數,求原陣列。(output any)
解析:
設原陣列為,那麼a是乙個平方數,a+b是乙個平方數,a+b+c是平方數,其中b已知,a,c可自己調節,那麼如果a+b+c已經確定,則a+b越小越好,大了可以超過a+b+c的預設值了。所以可以貪心,找最小的a使a為平方數且a+b是平方數。
對於a分析:找乙個最小的平方數a,使a+b為平方數。
對於c分析:已有a+b,找乙個最小的c,使a+b+c為平方數,因為c可以排程,所以問題變成找最小的大於a+b的平方數x使x+d為平方數。
對於第乙個數分析,設a[1]=a^2,a[1]+a[2]=x^2
,那麼a[2]=x^2-a^2=(x+a)(x-a)
,顯然,a[3]是可以調節的,所以a[1]+a[2]越小越好,即x^2越小越好,x=((x+a)+(x-a))/2
,也就是將a[2]分成兩個數p,q
的乘積,且p+q
越小越好,那麼|p-q|
越小越好,即將a[2]分成兩個差較小的數的乘積
,那麼從a[2
]\sqrt
a[2]
開始往下找即可。
對於第三個數分析,設m=a[1]+a[2],c=a[3],x^2=m+c,d=a[4],其中m和d已知:
c>=1,所以知道了x的下限:m+1
\sqrt
m+1
x 2+
d=y2
d=(y
−x)(
y+x)
(y+x
)−(y
−x
)>=2
m+
1x^2+d=y^2\\d=(y-x)(y+x)\\(y+x)-(y-x)>=2\sqrt
x2+d=y
2d=(
y−x)
(y+x
)(y+
x)−(
y−x)
>=2
m+1
也就是說,除了|p-q|
需要較小以外,還需要∣p−
q∣
>=2
m+
1|p-q|>=2\sqrt
∣p−q
∣>=2
m+1
還有,p和q是(y-x)和(y+x),所以一定是同號的,那麼d為偶數的時候,就一定是兩個偶數的乘積,那麼如果d不能整除4,一定不行。
#include
using namespace std;
#define ll long long
#define debug(i) printf("# %d\n",i)
ll a[
100009];
ll deal1
(ll val)
}else
for(i-
=i%2
;i>=
2;i-=2
)}return-1
;}ll deal
(ll m,ll val)
}else
for(i-
=i%2
;i>=
2;i-=2
)}return-1
;}intmain()
if(cant)
return0*
printf
("no\n");
a[1]
=deal1
(a[2])
;if(a[1]==
-1)return0*
printf
("no\n");
ll sum=a[1]
+a[2];
for(
int i=
3;i<=n;i+=2
) sum+
=a[i]
+a[i+1]
;}printf
("yes\n");
for(
int i=
1;i<=n;i++
)printf
("%lld%c"
,a[i]
,(i==n?
'\n'
:' '))
;}
世界是平的,網路也是平的
地點 某機房監控室 人物 值班工程師小陳 星期五的下午,窗外陽光明媚,大家都盼望順順利利地度過這週末前的半天時光。經過午休的值班工程師小陳懶散地走進了機房室,望了望監控大螢幕上的mocha network focus 網路拓撲圖,發現所有被監控的網路裝置都正常,於是他興致盎然的拿起了放在書桌上的一本...
判斷平閏年
普通版 year int input 請輸入年份 if year 4 0or year 400 0and year 100 0 年份滿足可整除四或四百但不能整除一百。print 這一年是閏年 else print 這一年是平年 可以加個while迴圈 while1 year int input 請輸...
mysql 展平各列 MYSQL 展平表查詢
我對下面的查詢有一些問題,我不確定如何修改它以給我所需的輸出,詳情如下 select listup.nodenumber as node,listup.station as extension,case when voiceserver 1 then keydescription else end ...