1022. Fib数列

Description

定义Fib数列:1,1,2,3,5,8,13,1,1,2,3,5,8,13,…

求第NN项除以20102010的余数

Input Format

输入仅一行,为一个整数NN

Output Format

输出仅一行,为第NN项除以20102010的余数

Sample Input

3

Sample Output

2

Limits:

对于70%的数据 N1,000,000N≤1,000,000

对于100%的数据 N210,000,000,000

解:

  此题数据范围太大,long到第99位就吼不住了,数据类型需要用BigInteger;

  对于时间也有限制,于是抛弃了递归,使用for循环解决,仍达不到要求;

  再次审题,对2010进行取余,难道是2010年出的题?还是说有什么规律可循的捷径?

  于是依次打印了从1到50000的结果,对结果分析后发现每隔2040个数字就循环一次,于是将n对2040取余,得解。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        n = n % 2040;
        System.out.println(fib3(n).divideAndRemainder(new BigInteger("2010"))[1]);

    }


    static BigInteger fib3(long n) {
        BigInteger n1 = new BigInteger("0");
        BigInteger n2 = new BigInteger("1");
        for (long i = 0; i < n; i++) {
            BigInteger temp = n1;
            n1 = n2.add(n1);
            n2 = temp;
        }
        return n1;
    }

}

 以下是为投机取巧的答案,为缩短执行时间,提前缓存一部分答案

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {

    static Map<Long, N1n2> map = new HashMap<>();
    static List<Long> list;

    static {
        map.put(25l, new N1n2(new BigInteger("75025"), new BigInteger("46368")));
        map.put(50l, new N1n2(new BigInteger("12586269025"), new BigInteger("7778742049")));
        map.put(75l, new N1n2(new BigInteger("2111485077978050"), new BigInteger("1304969544928657")));
        map.put(100l, new N1n2(new BigInteger("354224848179261915075"), new BigInteger("218922995834555169026")));
        map.put(125l, new N1n2(new BigInteger("59425114757512643212875125"), new BigInteger("36726740705505779255899443")));
        map.put(150l, new N1n2(new BigInteger("9969216677189303386214405760200"), new BigInteger("6161314747715278029583501626149")));
        map.put(175l, new N1n2(new BigInteger("1672445759041379840132227567949787325"), new BigInteger("1033628323428189498226463595560281832")));
        map.put(200l, new N1n2(new BigInteger("280571172992510140037611932413038677189525"), new BigInteger("173402521172797813159685037284371942044301")));
        map.put(225l, new N1n2(new BigInteger("47068900554068939361891195233676009091941690850"), new BigInteger("29090180355503362256910111038089984964854261893")));
        map.put(250l, new N1n2(new BigInteger("7896325826131730509282738943634332893686268675876375"), new BigInteger("4880197746793002076754294951020699004973287771475874")));
        map.put(275l, new N1n2(new BigInteger("1324695516964754142521850507284930515811378128425638237225"), new BigInteger("818706854228831001753880637535093596811413714795418360007")));
        map.put(300l, new N1n2(new BigInteger("222232244629420445529739893461909967206666939096499764990979600"), new BigInteger("137347080577163115432025771710279131845700275212767467264610201")));
        map.put(325l, new N1n2(new BigInteger("37281903592600898879479448409585328515842582885579275203077366912825"), new BigInteger("23041483585524168262220906489642018075101617466780496790573690289968")));
        map.put(350l, new N1n2(new BigInteger("6254449428820551641549772190170184190608177514674331726439961915653414425"), new BigInteger("3865462327928467072415604609040860366007401579690263197296200323999931849")));
        map.put(375l, new N1n2(new BigInteger("1049252690665646467530632231274619718410203796555123147644873726135009824265250"), new BigInteger("648473825618649048121038413079524682351409714485519861708388359345126257210057")));
        map.put(400l, new N1n2(new BigInteger("176023680645013966468226945392411250770384383304492191886725992896575345044216019675"), new BigInteger("108788617463475645289761992289049744844995705477812699099751202749393926359816304226")));
        map.put(425l, new N1n2(new BigInteger("29529908689737440719341867053506936071765074245955118399664162441967250186097733500962925"), new BigInteger("18250487254938611555074410636524312658020849229014745928158881386149462839394269270468043")));
        map.put(450l, new N1n2(new BigInteger("4953967011875066473162524925231604047727791871346061001150551747313593851366517214899257280600"), new BigInteger("3061719992484545030554313848083717208111285432353738497131674799321571238149015933442805665949")));
        map.put(475l, new N1n2(new BigInteger("831082459908702935293955784701120993704369028200651613859972830080739980541065544674812034151699525"), new BigInteger("513637207677450246125760857023446893186481668075116373246321641937144993869266524849692790595738232")));
        map.put(500l, new N1n2(new BigInteger("139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125"), new BigInteger("86168291600238450732788312165664788095941068326060883324529903470149056115823592713458328176574447204501")));
        map.put(525l, new N1n2(new BigInteger("23389779576526080530029005130016352147448857309113056992134835347034019051103908490247469955408778428975403650"), new BigInteger("14455678767661239941060750283349851372786616456634781515481577509301997444983826731071749118079998628070030493")));
        map.put(550l, new N1n2(new BigInteger("3923892811677015020359893809756397635478575034984185810645229419917883032980568363855269097880889736899565213021775"), new BigInteger("2425099125827785565352530979017842728315720351477448650144765807862542296838080812347151296511676978020230832740674")));
        map.put(575l, new N1n2(new BigInteger("658276182003137496407122225948572028855537578591430853088767389706978810842887148339827707619843413107416738130721399425"), new BigInteger("406837054462450812996767189512073064228323413256994879453570838208309535769155272605154275385167190627731943359478241407")));
        map.put(600l, new N1n2(new BigInteger("110433070572952242346432246767718285942590237357555606380008891875277701705731473925618404421867819924194229142447517901959200"), new BigInteger("68251391096100309964978446045087420307025606859722438323487946038808981838031799984351367205238184363410615527949660089420401")));
        map.put(625l, new N1n2(new BigInteger("18526362353047317310282957646406309593963452838196423660508102562977229905562196608078556292556795045922591488273554788881298750625"), new BigInteger("11449921622079721154497199899966677907638995896622219388843656194870204440338362332943924986323117322375295462212094869620734133568")));
        map.put(650l, new N1n2(new BigInteger("3108001074820004069863331500065201150560621097531260467068055400447631958062297366873598156121238898120887690588454054079963077605559825"), new BigInteger("1920850301309967491695705062383288298508513010920265753751523045231108313154412985175037599614903852324240126399573862950393639070921649")));
        map.put(675l, new N1n2(new BigInteger("521401368331405065117389673092721167865606665536905240054000465695003287479466298469643896877133715080215034906732232054782240651067620552450"), new BigInteger("322243767409511377996442898124980028146053329132633699011731476979859617917967681246287845081939810156089965167294206284633082153797620891457")));
        map.put(700l, new N1n2(new BigInteger("87470814955752846203978413017571327342367240967697381074230432592527501911290377655628227150878427331693193369109193672330777527943718169105124275"), new BigInteger("54059936666307888585371224524040479564193340847128274990827350063369752406767284486712908163966342091210712498754683466915904358153636317442639426")));
        map.put(725l, new N1n2(new BigInteger("14674191388313454600357027611358173119375591879847487011930876842209006713834988333365313313528159744469315527875342474570615800920148344418312374050725"), new BigInteger("9069149035398721464379973375373997790293619082001139869868820772992704510491546030693411867741445360645540149659674418260573237312845264404292253636643")));
        map.put(750l, new N1n2(new BigInteger("2461757021582324272166248155313036893697139996697461509576233211000055607912198979704988704446425834042795269603588522245550271050495783935904220352228801000"), new BigInteger("1521449511381584848252156602011488467821488310379786566556191516688856451447942006061924752830885523311222803138267352580566710331756138759882109079779505749")));
        map.put(775l, new N1n2(new BigInteger("412986819712346493611195411383827409934884076105338432187865946722511205681167419748123598380002157658381536968436929608311101496272839009791376254928568258611725"), new BigInteger("255239891487955204763028765174429290225574698227916993274034384901108067924350903389446104490355598143955494037924409485928126310226314831809427765737181917594632")));
        map.put(800l, new N1n2(new BigInteger("69283081864224717136290077681328518273399124385204820718966040597691435587278383112277161967532530675374170857404743017623467220361778016172106855838975759985190398725"), new BigInteger("42819299437432302617632053522679588759544125417235071019025069011950982099745888354964809941468470253059003158607459662907055750510443512830937550167717484757372564701")));
        map.put(825l, new N1n2(new BigInteger("11622999097037189591213506215508548965447537915921230004739800368897178872279920034979896388583348477011448434867458630347967413963423343267321657252193788725804094739116450"), new BigInteger("7183408493178320410924526135781279255064311314346347447450581595787943092936578044241602383980138142613787027035101534546874989247310640466257229185495880726118760744399093")));
        map.put(850l, new N1n2(new BigInteger("1949885951587339044875793733356219760673772926586260591210358470405525665390243100575540781157408285819450131557173898143210104351541330710230926558457389046268596497514105167175"), new BigInteger("1205095792266907509894541731682435242631523519165601719548992090110006190226084251379761345893856764884499995695494671695725754734025136105770222538218911996662126905998508805474")));
        map.put(875l, new N1n2(new BigInteger("327114817135866584604445222092786289485901368902485200957962177358441191520429751667933217022727867825940121997174498761270528946466892595242473813640691701043259805745267891689561625"), new BigInteger("202168075213672079260596535859701544874888296353804821387604809476395330074306063188656721192740907117768741920485668645381749874481665847487428943700400124657530952603334596459522807")));
        map.put(900l, new N1n2(new BigInteger("54877108839480000051413673948383714443800519309123592724494953427039811201064341234954387521525390615504949092187441218246679104731442473022013980160407007017175697317900483275246652938800"), new BigInteger("33915918467125937481103842962253932601438570727242174159971572162118549058705665656818324455395168664877858678207096253313382412388644498974363703129893047850890962136350142142644514430601")));
        map.put(925l, new N1n2(new BigInteger("9206238656347119105761075939859245540899205209303784407956483082831587944260196141437612756666554272070453632480397448211455632050122049663112979920932513717849103858791562780483921635355588425"), new BigInteger("5689768398165682472981133878451278523009637608647762675604795738876774718113916506327804992150205611581315356832469416472592015530113139666919895048261416544213718823613767148595520981851577168")));
        map.put(950l, new N1n2(new BigInteger("1544447803282326157141063860798140565135175279561812695372311151183404978544074576084779694906092198758336762454048905401589449506607204278264939097537573413980490519471907060934663660744135522705225"), new BigInteger("954521236278588975816913938063968779260873747465795884949378312109678175647627296076764558944928968059888214242449760455065605370660692836050793012165747204003730731419160152751883337579046951711449")));
        map.put(975l, new N1n2(new BigInteger("259098107935652557104489133457117935287501385615468464797658075441635685688364082902818922538578546112563887878124152051556445086889386828976126497605113833423713583754975704308251673170580841059906839650"), new BigInteger("160131437125022133570186981636530600256034719271619021063640417693436516163698377535248015679488033602845112321108929620534730439060000506398830226180857811739131287777823445209422467744194016647915972857")));
        map.put(1000l, new N1n2(new BigInteger("43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875"), new BigInteger("26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626")));
        map.put(1025l, new N1n2(new BigInteger("7291993184377412737043195648396979558721167948342308637716205818587400148912186579874409368754354848994831816250311893410648104792440789475340471377366852420526027975140687031196633477605718294523235826853392138525"), new BigInteger("4506699633677819813104383235728886049367860596218604830803023149600030645708721396248792609141030396244873266580345011219530209367425581019871067646094200262285202346655868899711089246778413354004103631553925405243")));
        map.put(1050l, new N1n2(new BigInteger("1223312068647805695866041001606414215425662481984418699889280184734522565471193888244259842002003203662301235495264496143544059342859868972795832692060911690562863420044109984978877398486541422811217041686547085400321400"), new BigInteger("756048437272288539690689795395260379730144585449845974339332918940173917152358791856341578591446769958919540638977087283361050810001659571116800529701043980611605511244669373657331212851990485445068045097568158383145549")));
        map.put(1075l, new N1n2(new BigInteger("205224055955716524528560317207536850842421543198909233460467841708964445924600358034657461933972468818345672416915898953787406832828162583537642477728171077497883382630545963165182138278697309109838300424900061420696710523925"), new BigInteger("126835441889743097340727630578408659799637671849019471097359434645125539664996893926320440962328494184219331453380308406324278256156218620677551154683047906877477752434202181140783410498973865075528473667617235450068805851032")));
        map.put(1100l, new N1n2(new BigInteger("34428592852410271940083613070919630635781894724017874396545964292826864597491403229723364359749415183436491553996529359881593653825629442519718308678951540824183325844045884746598230684751416672062124540392876245684047939604503325"), new BigInteger("21278040567621240190250096573155104972042275846793500076213962089840238578679717839125802288137532091430266033909453459192344331814384442833488318831899600435373589206725797621603635102375685791787722756398203081436561096758124901")));
        map.put(1125l, new N1n2(new BigInteger("5775775165718423686896083536919108472296943291638384169837856749189395473448719743146221686390579102522461728408357434360011931913228827739378625765827231917933990004420865053604611741069764550600511384130687612277101627816687792829250"), new BigInteger("3569625363791542317446289548549801195793192898133562038134749965251047698843013684074580611586560962152761354298903153220947185855837226770345052476235860023321756605787004287232049609550430834615074022411647420812496161603308597367693")));
        map.put(1150l, new N1n2(new BigInteger("968949817610517068989784142177170169491927134184328861440186560497308138314057537427444699560293305178020117202950943099666491069576775024211527079620660562463475637955832068101809155040203001458043806985210409063611722429839408752432312575"), new BigInteger("598843920676310971284728221144513294980616938755826776926317288996694975095443057232715435819498855859846929649968557921408774305553453332034240791299292432204380810378807215437061672169393462348235118865588105719323371648169214699759670274")));
        map.put(1175l, new N1n2(new BigInteger("162551990357933729176513601162680328341054296430194137415705521745426767340894002009814269986080586856360411984606714893751507642683281286749978822143620262385262368417042333581248470712304107468672651654246394819051253778829390679533484982723825"), new BigInteger("100462654980148230217488833424870984427793079458409448822069476757509295682237670423260587912589528169490341727161136599752360539494900070291233496159505650195274989153280833874723907472041666246552702610625000225991055571881011788849690642204207")));
        map.put(1200l, new N1n2(new BigInteger("27269884455406270157991615313642198705000779992917725821180502894974726476373026809482509284562310031170172380127627214493597616743856443016039972205847405917634660750474914561879656763268658528092195715626073248224067794253809132219056382939163918400"), new BigInteger("16853715462723491170192455155474509439735508098002844482595024267242834241944568802972062546036647271061368074350126366761024314387612704997681075881249068173708819887547926782036364656854243643357321405009295781778073579513653790357382166526579640801")));
        map.put(1225l, new N1n2(new BigInteger("4574823086285963278332765105808442498112316180732924897917256483579560610148242117926489242097271963125219875518951281115267144676317608379497163063975145486291928584545684510232535431843961894043578952917818325849564232050864527609030508537790563097426225"), new BigInteger("2827396159842418257182804699555048011544339558456848272703033314918994592020372102637633855208914570753115697690541891141357336605732655542610875041205458422049070983350202734034483405073248675325309262472317172257496401998781129096025801427515217762620768")));
        map.put(1250l, new N1n2(new BigInteger("767476895805689369991789277073521737239462473500936993792414590762971170414053972421838788552962951090412321568104958251305958672537315916096680015791574354131667637189603239871595291143454548069913507248538315878474818381309151810472376275027339038726484850625"), new BigInteger("474326807188177644705967990372246864620164458106014831174936416426720476019172478552536661986674779850150089831324366274115374513075340340871555712785349986222623265411522180751906897300529635678103450824975722540099149677495594577792038263638762613601602301249")));
        map.put(1275l, new N1n2(new BigInteger("128752691521833077485478524189463845266837906515103007196342189058904063003411669077608339124360106879975933441712075776716290213978799800076612744508707468287457839968856957708644382147749613870600721783565615363006632332316368848927520843883891933013584388123126850"), new BigInteger("79573539503523266013360314290021310955098457667867493651195356428866087092371388766472475054184181597649943790945922708202411234829389507530685713475193974079898960050751443548470855732068635616067561689174061451521890621303834843963751260242328256247933621422454257")));
        map.put(1300l, new N1n2(new BigInteger("21599680283161715807847052066540433422883515772119658063766498972503219104278316186542706552263614678844605521205471865945806520838603391933189946547621953603163789045147079719349493433360218263689302235202664706161893962580201172846238976101277970849319269574650368333475"), new BigInteger("13349336561124893436855517330314233137510519221439283060524199021037940053130037026871361366117529150990027000163029029282069077440328587685930706319183571998403279423296736186546541409219473276887639852215633173993739615060651786935698469747305268860048354877053950909826")));
        map.put(1325l, new N1n2(new BigInteger("3623583964112245297162062379220368175645825334713403862950634641322454729211738664774002662991904601262009973722927099144646523519121233848082678422852219302929067882290377080766647325582587958282530646150434955553991108419423761290174265718654014511536541916126504830115226325"), new BigInteger("2239498050910446787363841708864206379671923526062974023184467645619541217682014228757337842907715282953422101171999856772335113208669375433608810730343240935499326533411582719441985776900538912136015984863614398591537813013711895049423545827241430469472900318777381480005773843")));
        map.put(1400l, new N1n2(new BigInteger("17108476902340227241249719513231821477382749898026920041550883749834348017250935801359315038923367841494936038231522506358371361016671790887791259870264957823133253627917432203111969704623229384763490617075388642696139893354058660570399927047816296952516330636633851111646387885472698683607925"), new BigInteger("10573620221388775864427906936273924714349424343122542609372806319825783387389898145491654340696207977970310085933054184270874783658707602685314951512366803899425734968257110575262591138358632404883028772011717984556166300157965940742927387906176446848324713233936084752836275187153808643885101")));
        map.put(1500l, new N1n2(new BigInteger("13551125668563101951636936867148408377786010712418497242133543153221487310873528750612259354035717265300373778814347320257699257082356550045349914102924249595997483982228699287527241931811325095099642447621242200209254439920196960465321438498305345893378932585393381539093549479296194800838145996187122583354898000"), new BigInteger("8375056248993139455049166839161507580700951645259326077476024530190249793122625956172711451179970423221527641010767943444743688189586986881311526079669891181504713074057187888904564000541671421981786662930007521318154320452258888890718832980474892271737110708355492262357711279126593613602544365827073452325051001")));
        map.put(1600l, new N1n2(new BigInteger("10733451489189611103121609043038710477166925241925645413424099370355605456852169736033991876014762808340865848447476173426115162172818890323837138136782951865054538417494035229785971002587932638902311416018904156170269354720460896363558168129004231138415225204738582550720791061581463934092726107458349298577292984375276210232582438075"), new BigInteger("6633637836917354213428467209191015973854233409828120519266881416663357605333724272522941476939513307700326026415369549755651599438701172128996295172265828805993235382275148778350142384446267295880648011812207345363174584300696264787647013528106292836422354254929073254431525519091284141406930232298618461309670458410202619694912845026")));
        map.put(1700l, new N1n2(new BigInteger("8501653935514177120246392248625833924052052390491381030300605977750345588982825628424071479174753549360050542305550855066813804919653208931716726270523366654632196914963456017388482153512031453762253405647846054195256306803128353238958271508645704380482264873664932470684902865035316770576841658424488971423774980675657727215724203704712303499875347712525"), new BigInteger("5254311092737068203624565463001772099376536210233105392512621970177360479191551532678168536899758819446068223215090829086541018756202466225906492138879676209780699219805514497111966131239787629989204635937861844753818804115584035239739036887157660504195610933919331008285101389563671314750581113033684344645849813405807670623468481522426085415149069845301")));
        map.put(1800l, new N1n2(new BigInteger("6733912172802933472606353001846945074658287378884326089477601632746080275952604203199580265153593862390858117766432295498560989719530281829452850286454536277301941625978000791367655413469297462257623927534855511388238610890658838439857922737938956952361558179389004339772497124977152035343580348215676156404424782380266118900316342135562815217465023272599528784782167145877600"), new BigInteger("4161786600048868158820668404591480115093079132057216233101044749272992519168489519504144015086183170348369538451961417321853800012766355717220671816229325199857847089078431895045904450869851473591376897257534439768744268488064796985088472950099078604944926290785326658539728118177583046151659832304898153948507241760118442927962509433343172684651462654947322638155607790661201")));
        map.put(1900l, new N1n2(new BigInteger("5333735470177196739708654380013216364182711606231750028692155598599810955874132791398352277818697705852238294681640540003099177608752396895596802978549351480795061056237106714875097510390814693260599058125376898729211167801038969363574832655129782312934864836052394362613749572576206467264763038030296298813969690740057870184219763032388920988134497081981723092930599196773940722440994526411542675"), new BigInteger("3296429807570408718474687161970423640553000914140191143276046572123113795124791158236931171103765518315700300558282972309520765508726592778409432769440459759621260988695506400520051116242293004894712031163329854109156006595060753335400665580389188880012271451095183112343875581935969515957328582972245743759906437180681288388317919503483020758259460028548290358410739666850718135725581492399980226")));
        map.put(2000l, new N1n2(new BigInteger("4224696333392304878706725602341482782579852840250681098010280137314308584370130707224123599639141511088446087538909603607640194711643596029271983312598737326253555802606991585915229492453904998722256795316982874482472992263901833716778060607011615497886719879858311468870876264597369086722884023654422295243347964480139515349562972087652656069529806499841977448720155612802665404554171717881930324025204312082516817125"), new BigInteger("2611005926183501768338670946829097324475555189114843467397273230483773870037923307730410719313972291638157639230613843870597997481070930648667960025707364078851859017098672504986584144842548768373271309551281830431960537091677315014266625027123872238011234749984205478230617988978500613170516952885123444971471854671812569739975450866912490650853945622130138277040986146312325044424769652148982077548213909414076005501")));
        map.put(2100l, new N1n2(new BigInteger("3346258772894381788558434639941537877209053265053766990305264828948531270612382453397314273063065935765746863854356162204522216176489247137222743768063462632211603523255594286278039122388564394749151100734726712758604422072167490548845665501380314253429613265231899378789412217095899219158241009830329440878555524678295655938399582702177130182044596966419762299111936890305975459231961735528447500193845931171707920809046738569678456857200"), new BigInteger("2068101656801243294130241572260114570176060650572084321589905216490103031665135541508808937585745380055523531395367835209724399845158056643753345596993132039746469913149208675806729389452919219271521665352134836896985036812518345052027907441188362734415384222929825047520605354582559277074414019021614620860514379329186491380563540806318475337288015976348099445037963179682803722430461391487986038310822406050530003672990696953219016471401")));
        map.put(2200l, new N1n2(new BigInteger("2650473996596436536356196798944232122138617049795750388692937504820987398314396962165291928984759310943187283298303610029503030140838762839122828018658103022518383286820431142237783429918908794457401138893192264119726140265930740092020458651842019276316961265150890061616625689188717302632243432890033319431457844402580536768596104366856103703091630247436446218920974144804980906861110942449601588371061780928081985120405866730904463678192727714343144775647275"), new BigInteger("1638083016194370894501016674468920690282590505823016206281538317520704853802202423526536972162448051845495830158137230716328348541224829718480188834725792732281265518303195775164576649821156876162482430364028166850204029532196297593324096697857006222618276130834440104536230219140048907113513134674719165834778927801764462494339960066818982067006966566999186862506923774582714308605533162742207668921708539427566609848337814833849484433892332480874977452315426")));
        map.put(2300l, new N1n2(new BigInteger("2099363164480411228108950195076642780142024754952279098975840876788599507370616882452907733818349306757511618553611198312859772220070824604427448033373209989521467276988869694744101288090226272558290815094203806059008194444403600759789733666026610197176944477098881203932938627522327758935505837469349943200317812825035125722288942228428392401282472388424299848896417660474033275132192570027146649054783364373485475450920349783511770870137655651717053574787905398717792933110921725"), new BigInteger("1297477790378430120742491228441725821087983483089923472544091867545805306246537754883186509063056366963085421665580601792819456355670504458030553884212242528391664038170995710413033494459015135366464953094975853121478740985757129262102447326819147755043550688192422495714865337758902252410327253123966947959586049083330779726122988759814063978917727001027974379662916555623867961119533076458585795670331960119925909743797164901389618475660839257356096504087199231381620939702365701")));
        list = new ArrayList(map.keySet());
    }

    public static void main(String[] args) {

        long n = new Scanner(System.in).nextLong();
        n = n % 2040;
        long key = getKey(n);
        if (key == 0) {
            System.out.println(fib3(n).divideAndRemainder(new BigInteger("2010"))[1]);
        } else {
            N1n2 n1n2 = map.get(key);
            System.out.println(fib3(n, n1n2.n1, n1n2.n2, key).divideAndRemainder(new BigInteger("2010"))[1]);
        }
    }

    static long getKey(long n) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) > n) {
                if (i == 0) {
                    return 0l;
                } else {
                    return list.get(i - 1);
                }
            }
        }
        return list.get(list.size() - 1);

    }

    static BigInteger fib3(long n) {
        BigInteger n1 = new BigInteger("0");
        BigInteger n2 = new BigInteger("1");
        for (long i = 0; i < n; i++) {
            BigInteger temp = n1;
            n1 = n2.add(n1);
            n2 = temp;
        }
        return n1;
    }

    static BigInteger fib3(long n, BigInteger n1, BigInteger n2, long bigen) {
        for (long i = bigen; i < n; i++) {
            BigInteger temp = n1;
            n1 = n2.add(n1);
            n2 = temp;
        }
        return n1;
    }
}

class N1n2 {
    BigInteger n1;
    BigInteger n2;

    N1n2(BigInteger n1, BigInteger n2) {
        this.n1 = n1;
        this.n2 = n2;
    }
}

猜你喜欢

转载自www.cnblogs.com/chenglc/p/10881778.html
fib