• <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
            精品午夜久久福利大片| 青青草原1769久久免费播放| 欧美日韩中文字幕久久久不卡| 国产精品无码久久四虎| 久久久久国产日韩精品网站| 久久亚洲精品国产精品婷婷 | 国产精品久久久99| 久久亚洲国产最新网站| 狠狠88综合久久久久综合网| 久久久精品视频免费观看| 久久人人爽人人人人爽AV| 久久久久国产精品| 久久久久久综合网天天| 久久国产一区二区| 人妻无码中文久久久久专区| 久久久精品国产Sm最大网站| 精品国产乱码久久久久久1区2区| 性高湖久久久久久久久AAAAA| 国内精品久久久久影院一蜜桃| 中文字幕无码久久人妻| 一级做a爱片久久毛片| 亚洲精品无码久久久久去q| 久久人人超碰精品CAOPOREN| 久久人人妻人人爽人人爽| 久久天天婷婷五月俺也去| 日本精品久久久久中文字幕8| 亚洲伊人久久大香线蕉综合图片| 久久久久国色AV免费看图片| 国产精品久久久久久久久免费| 亚洲国产另类久久久精品| 久久亚洲中文字幕精品一区| 欧美一级久久久久久久大| 久久国产精品波多野结衣AV| 久久国产精品久久久| 国产成人精品久久一区二区三区| 午夜不卡久久精品无码免费| 一本久久a久久精品vr综合| 一本色道久久88精品综合 | 久久se精品一区精品二区| 99久久精品国产麻豆| 国产精品一久久香蕉国产线看|