• URAL 1698


    题目大意:统计位数不大于n的自守数的个数。

    Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

    数据规模:1<=n<=2000。

    理论基础:

        自守数:参见链接1。

        性质定理1:一个数为自守数当且仅当它为一个自守数的后缀。

        性质定理2:(1除外)n位数的自守数仅有两个(位数包括前导0),优先考虑最高位不为0的时候。

    题目分析:有了两个性质定理以后我们可以知道,每个自守数都是已有的自守数+前缀数字而来的,所以只要知道n位的两个自守数,就可以得到n+1位的两个自守数。反过来思考,如果我们知道了n+1位的自守数后那么小于n+1位的自守数我们都可以写出来。这样就出现了一个想法,先用递归将两个两千位(bign)(仅用到大数的乘法操作不是很困难)的自守数求出来,然后我们再找出值相同的自守数的个数m。用总数:1+2*n减去m即为答案了。当然,打表肯定是最好啦。扫描前导零的个数即为重复的个数。

    代码如下:    

     

    #include<iostream>
    #include<cstdio>
    using namespace std;
    char number1[2001]=
    "0302695456948792438016548848805106486276062082716415913252360
    9790500938385405426324719893931802209823600162545177681029159
    3965045066578090330527721983852863418796455114247485363072354
    5704904450912521423427595549184397398445871252869481982692702
    9255264834903206526851272202961318699947776535481291519857640
    4229681830917734452777232007376038258831727292795636574190144
    4523595431910306357249617898820317578776106213770808096781137
    4931911766563031490205784352509572880668464121069252802275061
    2985116162063840067789794024490238751112586895345495148882006
    7866770234100283954928297028644727362521753544319791185506815
    7264858804852673871684804002188529473022223344541221328464844
    1535937936631336044589403287234784019473575603613462120086753
    7334691331433871735088021260028575298538664393102232655345477
    6845029957025561658143370236502074744856814787872902092412582
    9053012491246688683515876774998917686787157281349408792768945
    2979709777230540335661882819870221063055796723980661119019774
    4642421025136748701117131278125400133690086034889084364023875
    7659368219796261819178335204927041993248752378258671482789053
    4489744014261231703569954841949944461060814620725403655999827
    1588356035049327795540741961849280952093753026852390937562839
    1485716123673519706092242423987770075749557872715597674134589
    9753769551586271888794151630756966881635215504889827170437850
    8028434084412644126821848514157729916034497017892335796684991
    4473895660019325458276780006183298544262328272575561107331606
    9701586498422229125548572987933714786632317240551575610235254
    3994999345608083801190741530060056055744818709692785099775918
    0500754164285277081620113502468060581632761716767652609375280
    5684421448619396049983447280672190667041724009423446619781242
    6690787535944616698508064636137166384049029219341881909581659
    5244778618461409128782984384317032481734288865727376631465191
    0498802944796081467376050395719689371467180137561905546299681
    4764263903953007319108169802938509890062166509580863811000557
    423423230896109004106619977392256259918212890625",number2[2001]=
    "9697304543051207561983451151194893513723937917283584086747639
    0209499061614594573675280106068197790176399837454822318970840
    6034954933421909669472278016147136581203544885752514636927645
    4295095549087478576572404450815602601554128747130518017307297
    0744735165096793473148727797038681300052223464518708480142359
    5770318169082265547222767992623961741168272707204363425809855
    5476404568089693642750382101179682421223893786229191903218862
    5068088233436968509794215647490427119331535878930747197724938
    7014883837936159932210205975509761248887413104654504851117993
    2133229765899716045071702971355272637478246455680208814493184
    2735141195147326128315195997811470526977776655458778671535155
    8464062063368663955410596712765215980526424396386537879913246
    2665308668566128264911978739971424701461335606897767344654522
    3154970042974438341856629763497925255143185212127097907587417
    0946987508753311316484123225001082313212842718650591207231054
    7020290222769459664338117180129778936944203276019338880980225
    5357578974863251298882868721874599866309913965110915635976124
    2340631780203738180821664795072958006751247621741328517210946
    5510255985738768296430045158050055538939185379274596344000172
    8411643964950672204459258038150719047906246973147609062437160
    8514283876326480293907757576012229924250442127284402325865410
    0246230448413728111205848369243033118364784495110172829562149
    1971565915587355873178151485842270083965502982107664203315008
    5526104339980674541723219993816701455737671727424438892668393
    0298413501577770874451427012066285213367682759448424389764745
    6005000654391916198809258469939943944255181290307214900224081
    9499245835714722918379886497531939418367238283232347390624719
    4315578551380603950016552719327809332958275990576553380218757
    3309212464055383301491935363862833615950970780658118090418340
    4755221381538590871217015615682967518265711134272623368534808
    9501197055203918532623949604280310628532819862438094453700318
    5235736096046992680891830197061490109937833490419136188999442
    576576769103890995893380022607743740081787109376";
    
    int main()
    {
        int n,cnt=0;
        scanf("%d",&n);
        for(int i=1999;i>=1999-(n-1);i--)
        {
            if(number1[i]=='0')cnt++;
            if(number2[i]=='0')cnt++;
        }
        printf("%d
    ",2*n-cnt+1);
    	return 0;
    }

    其中number1,number2即为求出的两千位的两个自守数啦。记得打出自守数时一定要左补零。

    参考文献:

    http://zh.wikipedia.org/wiki/%E8%87%AA%E5%AE%88%E6%95%B0

    by:Jsun_moon http://blog.csdn.net/Jsun_moon

  • 相关阅读:
    php的命名空间层级与目录层级是一致的吗?
    PHP 反射应用之一(插件框架)
    一次http完整的请求tcp报文分析
    Restful based service 的跨域调用
    php 命名空间的目的
    浏览器跨域问题
    PHP 代码跟踪
    记一次分析别人源码的过程
    php script 的生命周期
    全局安装 vue
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3253716.html
Copyright © 2020-2023  润新知