• <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++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

            如果將2到2^20的所有素數打出來,程序長度超過可以提交的限制。如果打一部分,接著在程序里接著算也可以,不過
            如果對質因子的上界估計不好的話,也要超時或導致效率低。

            最小上界(上確界)是2^10,因為對于a<=2^20最多只有1個質因子會超過2^10,這用反證法很容易得到。因此我們只要算出1024以內
            的172個素數即可,程序很快就跑完了。

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

             1 // pku 3421 給一個整數X,求X的分解。1=X0,X1,X2,,Xm=X,其中Xi整除X(i+1)且Xi<X(i+1),要求最大的m跟有多少種這樣長度的鏈。
             2 // 算法:因為m要最大,所以每次Xi只能乘以一個質因子。若不然可以得到一個更短的鏈。
             3 // 先求出所有的質因子,所有質因子的排列除以重復的次數就是這種鏈的個數. 
             4 
             5 #include <iostream>
             6 #include <math.h>
             7 
             8 using namespace std;
             9 
            10 __int64 p[172];
            11 // 因子數目最多是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 // 先質因子分解,再求組合的個數
            49 void solve(__int64 a)
            50 {
            51     // j統計所有質因子的個數,k統計不同質因子個數
            52     int i,j=0,flag,l=0;
            53     memset(e,0,sizeof(e));
            54     // 用1024以內的素數分解a,注意到a<=2^20,a最多含有一個超過1024的質因子 
            55     // a=p1^e1*p2^e2**pk^ek*ps^es,其中只有ps是大于1024的素數,且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一定是素數
            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 閱讀(450) 評論(0)  編輯 收藏 引用 所屬分類: Programming Contest
            Google PageRank 
Checker - Page Rank Calculator
            国产精品美女久久久久av爽| 99久久国产主播综合精品| 久久不射电影网| 久久久久综合中文字幕| 天天久久狠狠色综合| 久久亚洲熟女cc98cm| 色99久久久久高潮综合影院 | 国产成人久久激情91| 亚洲综合婷婷久久| 久久99热狠狠色精品一区| 国产真实乱对白精彩久久| 精品熟女少妇aⅴ免费久久| 久久久精品日本一区二区三区| 欧美伊人久久大香线蕉综合69 | 精品99久久aaa一级毛片| 亚洲午夜久久影院| 久久精品国产色蜜蜜麻豆| 国产亚洲精午夜久久久久久| 99久久国产免费福利| 久久久久高潮毛片免费全部播放 | 国产高潮久久免费观看| 国产午夜精品久久久久九九| 久久国产免费直播| 国产—久久香蕉国产线看观看| 亚洲欧洲久久av| 久久91亚洲人成电影网站| 久久er99热精品一区二区| Xx性欧美肥妇精品久久久久久| 国产精品一久久香蕉国产线看观看| 久久不见久久见免费视频7| 香蕉aa三级久久毛片| 国产精品无码久久综合网| 久久国产精品久久精品国产| 久久精品国产亚洲AV久| 亚洲精品99久久久久中文字幕| 99久久婷婷国产一区二区| 99国产欧美久久久精品蜜芽| 久久亚洲精品国产精品| 亚洲国产精品无码久久| 色综合久久久久无码专区| 亚洲香蕉网久久综合影视|