2018.1.26 T1 家財萬貫

今天的題好難啊,第一題我都不會,感覺自己省選要GG了。

這道題好像有好多AC但不正確的做法。


【題面】

家財萬貫

1

2

3


【思路】

標算:

第二型佩爾方程,結論:
x2dy2=1x+yd=(a+bd)2n+1

對於這樣的方程,如果d不爲完全平方數,那麼有x的所有正整數解可以表示爲:
x=(1+d)2n+1+(1d)2n+12:nN

對公式進行推導:

a2+a=2b2+2b

4a2+4a=8b2+8b

4a2+4a+1=8b2+8b+21

(2a+1)2=2(2b+1)21

(2a+1)22(2b+1)2=1

令:x=2a+1,y=2b+1,d=2 ,帶入第二型佩爾方程。

x=(1+2)2n+1+(12)2n+12:nN

我們可以用這個東西的增長顯然是指數級的,儘管10150 很大,取個log也不過兩三百。所以我們可以打表,我比較懶,用了Python的Decimal高精度十進制數的功能,後文中附有代碼。

[2018.1.27] 補記:

這道題竟然TM有線性遞推式,有一種爆粗口的衝動。。

an=6an1an2+2

今天早上我們在機房成功的證明了這一點!真是太激動了,感謝MJX和HYZ大佬!

首先,由佩爾方程得:

Xn=(1+2)2n+1+(12)2n+12

又有:

An=Xn12Xn=2An+1

{Xn} 顯然是個線性遞推式的通項公式。

而且形式恰好如我的另一篇博客 《數列 A[n] = p A[n-1] + q A[n-2] の 通項公式 》 中所說。

整理一下或許更明顯一些:

Xn=1+22(3+22)n+122(322)n

其中t1=3+22,t2=322 恰好是方程x26x+1=0 的兩根。(這裏省略了具體的證明,具體的證明參見上面說到的那篇博客。)

這就說明x2=6x1 是數列{Xn} 的特徵方程。

所以有遞推式:Xn=6Xn1Xn2

把他們都換成A數列的表達式。

(2An+1)=6(2An1+1)(2An2+1)An=6An1An2+2

An=6An1An2+2 這個東西顯然是可以直接遞推的對吧,高精度一下就可以穩AC。

MJX大佬現場其實就想出了這個線性遞推式!他想出的是:

An=5An1+5An2An3+4

推導是這樣的:

An=6An1An2+2

An=(5An1+An1)An2+2

An=5An1+(6An2An3+2)An2+2

An=5An1+5An2An3+4

得證,真是妙極了。

[2018.1.27] 補記畢。

考場實用做法:

首先考慮對於一個滿足條件的a:

a2+a=2b2+2b

2b2+2b(a2+a)=0

b=2+4+8(a2+a)4=1+1+2a2+2a2

只要檢驗1+2a2+2a 是不是整數、是不是奇數,就可以檢驗a是否可行。(二分開根號,再平方會去,看相不相等可能就可以,不過這個做法好像很難寫我就沒寫。)這樣我們就可以檢驗一個a是不是滿足條件的。

打一個108 以內的滿足條件的a的表,發現個數很少,增長很快。

增長很快?搞不好通項公式裏能套個指數函數什麼的,我們試着去算一下相鄰兩個數的比值,我們算一算。

> 3       ,
> 20      , 6.6666666666666666666666666666667
> 119     , 5.95
> 696     , 5.8487394957983193277310924369748
> 4059    , 5.8318965517241379310344827586207
> 23660   , 5.8290219265829021926582902192658
> 137903  , 5.8285291631445477599323753169907
> 803760  , 5.8284446313713262220546326040768
> 4684659 , 5.8284301283965362794864138548821

(逗號右面的數是這一行的數和上一行的數的比值。)

我們驚奇的發現,它們的比值會趨近於一個定值 5.8284…,我們令這個常數爲Can3×Cn1

現在我們已經知道了an 的近似範圍,我們可以根據近似值向上向下分別檢驗幾十個,就可以找到具體的數值。另外我們還可以根據這種方法,精確出更加精確的C。

現在我們又可以打表了。


【代碼】

(標算)python高精度打表版本

# -*- encoding: gb2312 -*-

from decimal import Decimal
from decimal import getcontext

f = open("data.txt","w")
getcontext().prec = 200 #設置精度位數

for i in range(1,300):
    d = Decimal('2') ** Decimal('0.5')
    t1 = Decimal('1') + d
    t2 = Decimal('1') - d
    p = Decimal('2') * Decimal(str(i)) + Decimal('1')
    x = ( (t1)**p + (t2)**p  ) / Decimal('2')
    a = (x - Decimal('1')) / Decimal('2')
    print >>f,'\"'+str(long(a + Decimal('0.5')))+'\"',","
    print i," "
    if a>=10 ** 150 :
        break
f.close()

然後把表貼到程序裏面:

#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string val[]={
"3" ,
"20" ,
"119" ,
"696" ,
"4059" ,
"23660" ,
"137903" ,
"803760" ,
"4684659" ,
"27304196" ,
"159140519" ,
"927538920" ,
"5406093003" ,
"31509019100" ,
"183648021599" ,
"1070379110496" ,
"6238626641379" ,
"36361380737780" ,
"211929657785303" ,
"1235216565974040" ,
"7199369738058939" ,
"41961001862379596" ,
"244566641436218639" ,
"1425438846754932240" ,
"8308066439093374803" ,
"48422959787805316580" ,
"282229692287738524679" ,
"1644955193938625831496" ,
"9587501471344016464299" ,
"55880053634125472954300" ,
"325692820333408821261503" ,
"1898276868366327454614720" ,
"11063968389864555906426819" ,
"64485533470821007983946196" ,
"375849232435061491997250359" ,
"2190609861139547943999555960" ,
"12767809934402226172000085403" ,
"74416249745273809088000956460" ,
"433729688537240628356005653359" ,
"2527961881478169961048032963696" ,
"14734041600331779137932192128819" ,
"85876287720512504866545119809220" ,
"500523684722743250061338526726503" ,
"2917265820615946995501486040549800" ,
"17003071238972938722947577716572299" ,
"99101161613221685342183980258883996" ,
"577603898440357173330156303836731679" ,
"3366522229028921354638753842761506080" ,
"19621529475733170954502366752732304803" ,
"114362654625370104372375446673632322740" ,
"666554398276487455279750313289061631639" ,
"3884963735033554627306126433060737467096" ,
"22643228011924840308557008285075363170939" ,
"131974404336515487224035923277391441558540" ,
"769203198007168083035658531379273286180303" ,
"4483244783706493010989915264998248275523280" ,
"26130265504231789982903833058610216366959379" ,
"152298348241684246886433083086663049926232996" ,
"887659823945873691335694665461368083190438599" ,
"5173660595433557901127734909681545449216398600" ,
"30154303748655473715430714792627904612107953003" ,
"175752161896499284391456553846085882223431319420" ,
"1024358667630340232633308608283887388728479963519" ,
"5970399843885542111408395095857238450147448461696" ,
"34798040395682912435817061966859543312156210806659" ,
"202817842530211932503493976705300021422789816378260" ,
"1182109014785588682585146798264940585224582687462903" ,
"6889836246183320163007386812884343489924706308399160" ,
"40156908462314332295459174079041120354323655162932059" ,
"234051614527702673609747657661362378636017224669193196" ,
"1364152778703901709363026771889133151461779692852227119" ,
"7950865057695707582568412973673436530134660932444169520" ,
"46341037567470343786047451070151486029346185901812790003" ,
"270095360347126355133716293447235479645942454478432570500" ,
"1574231124515287787016250309613261391846308540968782632999" ,
"9175291386744600366963785564232332871431908791334263227496" ,
"53477517195952314414766463075780735836745144207036796731979" ,
"311689811788969286121634992890452082149038956450886517164380" ,
"1816661353537863402315043494266931757057488594498282306254303" ,
"10588278309438211127768625972711138460195892610538807320361440" ,
"61713008503091403364296712341999899004117867068734561615914339" ,
"359689772709110209058011648079288255564511309801868562375124596" ,
"2096425627751569850983773176133729634382949991742476812634833239" ,
"12218863993800308896844627408723089550733188640652992313433874840" ,
"71216758335050283530083991276204807670016181852175477067968415803" ,
"415081686016501392283659320248505756469363902472399870094376619980" ,
"2419273357763958070171871930214829731146167232982223743498291304079" ,
"14100558460567247028747572261040472630407639495420942590895371204496" ,
"82184077405639524102313561636028006051299669739543431801873935922899" ,
"479003905973269897585133797555127563677390378941839648220348244332900" ,
"2791839358433979861408489223694737376013042603911494457520215530074503" ,
"16272032244630609270865801544613296692400865244527127096900944936114120" ,
"94840354109349675763786320043985042778392148863251268123885454086610219" ,
"552770092411467445311852118719296959977952027934980481646411779583547196" ,
"3221780200359454996107326392271796717089320018746631621754585223414672959" ,
"18777911109745262531332106234911483342557968084544809248881099560904490560" ,
"109445686458112120191885311017197103338258488488522223871532012142012270403" ,
"637896207638927458619979759868271136686992962846588533980310973291169131860" ,
"3717931559375452631527993248192429716783699288591008980010333827605002520759" ,
"21669693148613788330547979729286307164015202768699465346081691992338845992696" ,
"126300227332307277351759885127525413267307517323605783096479818126428073435419" ,
"736131670845229875780011331035866172439829901172935233232797216766229594619820" ,
"4290489797739071977328308101087671621371671889714005616300303482470949494283503" ,
"25006807115589201988189837275490163555790201437111098464569023678059467371081200" ,
"145750352895796139951810715551853309713369536732952585171113838585885854732203699" ,
"849495310259187637722674456035629694724427018960604412562114007837255661022140996" ,
"4951221508659329686384236020661924858633192577030673890201570208437648111400642279" ,
"28857833741696790480582741667935919457074728443223438928647307242788633007381712680" ,
"168195780941521413197112213986953591883815178082309959681682273248294149932889633803" ,
"980316851907431688702090542253785631845816340050636319161446332246976266589956090140" ,
"5713705330503068719015431039535760199191082862221507955286995720233563449606846907039" ,
"33301915131110980625390495694960775563300680833278411412560527989154404431051125352096" ,
"194097785456162815033327543130228893180613002137448960520076172214692863136699905205539" ,
"1131284797605865909574574763086412583520377331991415351707896505299002774389148305881140" ,
"6593611000179032642414121035388246607941650989811043149727302859579323783198189930081303" ,
"38430381203468329944910151449243067064129528606874843546655920652176939924799991274606680" ,
"223988676220630947027046787660070155776835520651438018130208221053482315765601757717558779" ,
"1305501676120317352217370574511177867596883595301753265234593405668716954668810555030745996" ,
"7609021380501273166277176659406997049804466051159081573277352212958819412247261572466917199" ,
"44348626606887321645445689381930804431229912711652736174429519872084199518814758879770757200" ,
"258482738260822656706396959632177829537575010218757335473299767019546377700641291706157626003" ,
"1506547802958048618592936068411136172794220148600891276665369082245194066685032991357174998820" ,
"8780804079487469054851219450834639207227745881386590324518914726451618022409556656436892366919" ,
"51178276673966765710514380636596699070572255139718650670448119276464514067772306947264179202696" ,
"298288855964313125208235064368745555216205784956925313698169800932335466384224285027148182849259" ,
"1738554859111911985538896005575876632226662454601833231518570686317548284237573403215624917892860" ,
"10133040298707158788025140969086514238143768942654074075413254316972954239041216134266601324507903" ,
"59059686933131040742611949808943208796635951201322611220960955215520177150009723402383983029154560" ,
"344225081300079085667646557884572738541671938265281593250352476976148108661017124280037296850419459" ,
"2006290800867343473263267397498493222453395678390366948281153906641368474816093022277839798073362196" ,
"11693519723903981753911957827106386596178702132076920096436570962872062740235541009387001491589753719" ,
"68154827542556547050208479565139826354618817114071153630338271870591007966597153034044169151465160120" ,
"397235445531435300547338919563732571531534200552350001685593060260673985059347377194878013417201207003" ,
"2315257845646055256233825037817255602834586386200028856483220089693452902389487110135223911351742081900" ,
"13494311628344896236855611307339801045475984116647823137213727477900043429277575283616465454693251284399" ,
"78650611924423322164899842806221550670021318313686909966799144777706807673275964591563568816807765624496" ,
"458409359918195036752543445529989502974651925765473636663581141188340802610378212265764947446153342462579" ,
"2671805547584746898350360830373715467177890236279154910014687702352338007988993309003026115860112289150980" ,
"15572423925590286353349621536712303300092689491909455823424545072925687245323581641752391747714520392443303" ,
"90762738005956971221747368389900104333378246715177580030532582735201785463952496541511324370427010065508840" ,
"529004004110151540977134588802688322700176790799156024359770951338285025538391397607315554474847540000609739" ,
"3083261286654952274641060164426229831867682498079758566128093125294508367766395889102382002478658229938149596" ,
"17970563715819562106869226397754690668505918197679395372408787800428765181059983937006976460397101839628287839" ,
"104740121008262420366574298222101914179167826687996613668324633677278082718593507732939476759903952807831577440" ,
"610470162333754960092576562934856794406501041930300286637539014263239731130501062460629884099026615007361176803" ,
"3558080852994267340188885079387038852259838424893805106156909451902160304064412867030839827834255737236335483380" ,
"20738014955631849081040733913387376319152529507432530350303917697149722093255976139724409082906507808410651723479" ,
"120870008880796827146055518400937219062655338619701376995666596730996172255471443971315614669604791113227574857496" ,
"704482038329149113795292376492235938056779502210775731623695662688827311439572687688169278934722238870954797421499" ,
"4106022221094097855625698740552478409278021674644953012746507379401967696381964682157700058938728642112501209671500" ,
"23931651288235438019958900066822634517611350545658942344855348613722978866852215405258031074697649613804052460607503" ,
"139483885508318530264127701660383328696390081599308701056385584302935905504731327749390486389247169040711813553973520" ,
"812971661761675743564807309895477337660729139050193263993458157203892454161535751091084887260785364630466828863233619" ,
"4738346085061735931124716157712480697267984752701850882904363358920418819464483178797118837175465018742089159625428196" ,
"27617104848608739843183489636379406845947179377160912033432721996318620462625363321691628135792004747822068128889335559" ,
"160964283006590703127976221660563960378415091510263621317691968618991303956287696751352649977576563468190319613710585160" ,
"938168593190935478924673840327004355424543369684420815872719089717629203275100817186424271729667376061319849553374175403" ,
"5468047276139022170420066820301462172168845126596261273918622569686783915694317206367192980400427692899728777706534467260" ,
"31870115063643197543595727081481768677588527389893146827639016328403074290890802421016733610672898781337052816685832628159" ,
"185752643105720163091154295668589149893362319212762619691915475400731661829650497319733208683636964995122588122408461301696" ,
"1082645743570677781003330046930053130682585387886682571323853836075986896687012181497382518491148891189398475917764935182019" ,
"6310121818318346522928825985911729634202150008107332808251207541055189718292422591664561902263256382141268267384181149790420" ,
"36778085166339401356569625868540324674530314660757314278183391410255151413067523368489988895088389401658211128387321963560503" ,
"214358389179718061616488929225330218412979737956436552860849140920475718760112717619275371468267080027807998502939750631572600" ,
"1249372249911968968342363949483440985803348113077862002886911454112599161147608782347162239914514090765189779889251181825875099" ,
"7281875110292095748437694767675315696407108940510735464460619583755119248125539976463698068018817464563330680832567340323677996" ,
"42441878411840605522283804656568453192639305529986550783876806048418116327605631076435026168198390696614794305106152860116192879" ,
"247369395360751537385265133171735403459428724239408569238800216706753578717508246482146458941171526715125435149804349820373479280" ,
"1441774493752668618789306994373843967563933039906464864648924494192103355977443847816443727478830769594137816593719946062124682803" ,
"8403277567155260175350576833071328401924169515199380618654746748445866557147154840416515905931813090849701464412515326552374617540" ,
"48977890909178892433314154004054126443981084051289818847279555996483095986905485194682651708112047775504070969881372013252123022439" ,
"285464067887918094424534347191253430261962334792539532465022589230452709364285756327679394342740473562174724354875716752960363517096" ,
"1663806516418329674113891929143466455127792924703947375942855979386233160198809052771393714348330793597544275159372928504510058080139" ,
"9697375030622059950258817227669545300504795213431144723192113287086946251828568560300682891747244288023090926601361854274099984963740" ,
"56520443667314030027439011436873805347900978355882920963209823743135444350772602309032703636135134934541001284448798197140089851702303" ,
"329425286973262120214375251393573286786901074921866381056066829171725719852807045293895538925063565319222916780091427328566439125250080" ,
"1920031278172258691258812496924565915373505471175315365373191151287218874766069669454340529914246256980796499396099765774258544899798179" ,
"11190762382060290027338499730153822205454131752130025811183080078551587528743610971432147640560413976565556079596507167316984830273538996" ,
"65224543014189481472772185883998367317351285041604839501725289320022306297695596159138545313448237602412539978182943238127650436741435799" ,
"380156495703076598809294615573836381698653578497499011199168655841582250257429965983399124240129011637909683789501152261448917790175075800" ,
"2215714431204270111382995507559019922874570185943389227693286645729471195246884199741256200127325832225045562758823970330565856304309019003" ,
"12914130091522544069488678429780283155548767537162836354960551218535244921223875232464138076523825981712363692763442669721946220035679038220" ,
"75269066117930994305549075071122679010418035037033628902070020665481998332096367195043572259015630058049136593821832048001111463909765210319" ,
"438700266616063421763805771996955790906959442685038937057459572774356745071354327937797295477569954366582455870167549618284722563422912223696" ,
"2556932533578449536277285556910612066431338621073199993442687415980658472096029600431740200606404096141445598627183465661707223916627708131859" ,
"14902894934854633795899907569466716607681072283754161023598664923109594087504823274652643908160854622482091135892933244351958620936343336567460" ,
"86860437075549353239122159859889687579655095081451766148149302122676906052932910047484123248358723638751101216730416000450044501701432311272903" ,
"506259727518441485638833051589871408870249498204956435865297147812951842230092637010252095581991487210024516164489562758348308389272250531069960" ,
"2950697928035099560593876149679338765641841894148286849043633584755034147327622912014028450243590199621395995770206960549639805833932070875146859" ,
"17197927840692155877924423846486161184980801866684764658396504360717253041735644835073918605879549710518351458456752200539490526614320174719811196" ,
"100236869116117835706952666929237628344242969305960301101335392579548484103086246098429483185033708063488712754970306242687303353851988977443720319" ,
"584223286856014858363791577728939608880477013969077041949615851116573651576781831755502980504322698670413925071365085255584329596497613689942510720" ,
"3405102852019971314475796799444400024938619114508501950596359714119893425357604744434588399840902483958994837673220205290818674225133693162211344003" ,
"19846393825263813028490989218937460540751237673081934661628542433602786900568846634852027418541092205083555100967956146489327715754304545283325553300" ,
"115673260099562906856470138514180363219568806923983106019174894887496827978055475064677576111405650746542335768134516673645147620300693578537741975799" ,
"674193166772113628110329841866144718776661603870816701453420826891378180967764003753213429249892812274170459507839143895381558006049856925943126301496" ,
"3929485740533118861805508912682687949440400816300917102701350066460772257828528547454602999387951222898480421278900346698644200415998447977121015833179" ,
}; //196 個

bool cmp(string a,string b){
    if(a.size() != b.size()) return a.size() < b.size();
    for(int i=0; i<a.size(); i++){
        if(a[i] != b[i]) return a[i]<b[i];
    }
    return false;
}

int main(){
    freopen("money.in","r",stdin);
    freopen("money.out","w",stdout);
    string c;
    cin >> c;
    int pos=lower_bound(val,val+196,c,cmp)-val;
    cout << val[pos] << endl;
    return 0;
}

有空學習一下pell方程。。我還是太菜了。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章