• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            bon

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            這道題從Ac人數(shù)以及題目大意上看應(yīng)屬于簡單題,但是我卻做了好多天 ToT。

            剛剛才看了一篇解題報告得到啟發(fā)過的。題目有點tricky,給一個小于等于2^20的數(shù),本質(zhì)上要求質(zhì)因子分解。

            題目有接近1/3的提交是超時,其實分解質(zhì)因子以及后面的計算沒什么可說的,主要是求素數(shù)表這里會超時。

            如果將2到2^20的所有素數(shù)打出來,程序長度超過可以提交的限制。如果打一部分,接著在程序里接著算也可以,不過
            如果對質(zhì)因子的上界估計不好的話,也要超時或?qū)е滦实汀?br>
            最小上界(上確界)是2^10,因為對于a<=2^20最多只有1個質(zhì)因子會超過2^10,這用反證法很容易得到。因此我們只要算出1024以內(nèi)
            的172個素數(shù)即可,程序很快就跑完了。

            另外打素數(shù)表的時候有一種比較快的算法,雖然只是在樸素算法基礎(chǔ)上做了一些小的優(yōu)化,不過即使在打1024以內(nèi)素數(shù)表就可以體現(xiàn)出
            優(yōu)越性了(69ms VS 79ms),對于更大的素數(shù)表,優(yōu)越性會更明顯。

             1 // pku 3421 給一個整數(shù)X,求X的分解。1=X0,X1,X2,,Xm=X,其中Xi整除X(i+1)且Xi<X(i+1),要求最大的m跟有多少種這樣長度的鏈。
             2 // 算法:因為m要最大,所以每次Xi只能乘以一個質(zhì)因子。若不然可以得到一個更短的鏈。
             3 // 先求出所有的質(zhì)因子,所有質(zhì)因子的排列除以重復(fù)的次數(shù)就是這種鏈的個數(shù). 
             4 
             5 #include <iostream>
             6 #include <math.h>
             7 
             8 using namespace std;
             9 
            10 __int64 p[172];
            11 // 因子數(shù)目最多是20個
            12 int e[21];
            13 int cnt;
            14 __int64 factor[21];
            15 
            16 // naive method
            17 void prime2()
            18 {
            19     int i,j,k,flag;
            20     p[0]=2;
            21     cnt=1;
            22     for(i=3;i<1024;i++){
            23         flag=0;
            24         j=sqrt(1.0*i);
            25 
            26         for(k=2;k<=j;k++){
            27             if(i%k==0) {flag=1;break;}
            28         }
            29         if(!flag) p[cnt++]=i;
            30     }
            31 }
            32 
            33 void prime()
            34 {
            35     int i,j,flag;
            36     p[0]=2;
            37     p[1]=3;
            38     cnt=2;
            39     for(i=5;i<=1024;i+=2){
            40         flag=0;
            41         for(j=1;p[j]*p[j]<=i;j++){
            42             if(i%p[j]==0) {flag=1;break;}
            43         }
            44         if(!flag) p[cnt++]=i;
            45     }
            46 }
            47 
            48 // 先質(zhì)因子分解,再求組合的個數(shù)
            49 void solve(__int64 a)
            50 {
            51     // j統(tǒng)計所有質(zhì)因子的個數(shù),k統(tǒng)計不同質(zhì)因子個數(shù)
            52     int i,j=0,flag,l=0;
            53     memset(e,0,sizeof(e));
            54     // 用1024以內(nèi)的素數(shù)分解a,注意到a<=2^20,a最多含有一個超過1024的質(zhì)因子 
            55     // a=p1^e1*p2^e2**pk^ek*ps^es,其中只有ps是大于1024的素數(shù),且es只能為0或1
            56     for(i=0;i<cnt && a>1;i++){
            57         flag=0;
            58         while(a%p[i]==0){
            59             flag=1;
            60             e[l]++;
            61             a/=p[i];
            62             j++;
            63         }
            64         if(flag==1) l++;
            65     }
            66     // 若此時a!=1則a一定是素數(shù)
            67     if(a!=1) {j++;e[l++]=1;}
            68     __int64 res = factor[j];
            69     for(i=0;i<l;i++){
            70         if(e[i]!=0) res/=factor[e[i]];
            71     }
            72     printf("%d %I64d\n",j,res);
            73 }
            74 
            75 int main()
            76 {
            77     prime1();
            78     //cnt=172;
            79     // 階乘
            80     factor[0]=1;
            81     for(__int64 i=1;i<21;i++) factor[i]=factor[i-1]*i;
            82     __int64 a;
            83     while(scanf("%I64d",&a)!=EOF){
            84         solve(a);
            85     }
            86     
            87     return 1;
            88 }
            89 
            posted on 2008-05-06 20:11 bon 閱讀(440) 評論(0)  編輯 收藏 引用 所屬分類: Programming Contest
            Google PageRank 
Checker - Page Rank Calculator
            国产精品99久久不卡| 久久只有这里有精品4| 久久综合综合久久狠狠狠97色88| 国产精品久久新婚兰兰| 99久久精品国产麻豆| 人人狠狠综合久久亚洲| 久久久久人妻精品一区二区三区| 91精品日韩人妻无码久久不卡| 久久国产成人午夜aⅴ影院 | 69国产成人综合久久精品| 久久精品成人欧美大片| 亚洲精品白浆高清久久久久久| 久久亚洲欧美日本精品| 久久久久久久波多野结衣高潮| www性久久久com| 久久国产劲爆AV内射—百度| 亚洲乱亚洲乱淫久久| 久久亚洲AV成人出白浆无码国产| 久久精品无码专区免费| 丁香狠狠色婷婷久久综合| 亚洲中文字幕无码久久2020| 武侠古典久久婷婷狼人伊人| 美女写真久久影院| 99久久成人国产精品免费 | 久久精品国产一区二区电影| 久久香综合精品久久伊人| 久久精品人人做人人爽电影| 欧美亚洲另类久久综合婷婷| 日韩精品国产自在久久现线拍| 久久天天躁狠狠躁夜夜躁2O2O| 思思久久精品在热线热| 婷婷久久综合九色综合绿巨人| 久久99久久无码毛片一区二区| 久久久久中文字幕| 色综合久久久久| 国产精品gz久久久| 欧美亚洲日本久久精品| 三级三级久久三级久久| 久久亚洲精品中文字幕| .精品久久久麻豆国产精品| 狠狠狠色丁香婷婷综合久久五月|