• <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>

            M.J的blog

            algorithm,ACM-ICPC
            隨筆 - 39, 文章 - 11, 評(píng)論 - 20, 引用 - 0
            數(shù)據(jù)加載中……

            【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)

            先來最基本的線性篩素?cái)?shù),以后的算法其實(shí)都是基于這個(gè)最基本的算法:
             1 #include<stdio.h>
             2 #include<string.h>
             3 #define M 10000000
             4 int prime[M/3];
             5 bool flag[M];
             6 void get_prime()
             7 {
             8     int i,j,k;
             9     memset(flag,false,sizeof(flag));
            10     k=0;
            11     for(i=2;i<M;i++){
            12         if(!flag[i])                            
            13         prime[k++]=i;
            14         for(j=0;j<k&&i*prime[j]<M;j++){
            15             flag[i*prime[j]]=true;            
            16             if(i%prime[j]==0)             
            17                 break;
            18         }
            19     }
            20 }
            21 int main()
            22 {}
             

            利用了每個(gè)合數(shù)必有一個(gè)最小素因子,每個(gè)合數(shù)僅被它的最小素因子篩去正好一次,所以是線性時(shí)間。
            代碼中體現(xiàn)在: if(i%prime[j]==0) break;
            -----------------------------------------------------------------------我是低調(diào)的分割線------------------------------------------------------------------------------------------
            然后可以利用這種線性篩法求歐拉函數(shù),需要用到以下幾個(gè)性質(zhì):
            //(1) 若(N%a==0 && (N/a)%a==0) 則有:E(N)=E(N/a)*a;
            //(2) 若(N%a==0 && (N/a)%a!=0) 則有:E(N)=E(N/a)*(a-1); 
            其中a是N的質(zhì)因數(shù)。
            關(guān)于歐拉函數(shù)還有以下性質(zhì):
            (1) phi[p]=p-1;  (p為素?cái)?shù));
            (2)若N=p^n(p為素?cái)?shù)),則 phi[N]=(p-1)*p^(n-1);
            關(guān)于歐拉函數(shù),Wiki有很詳細(xì)的介紹。

             1 #include<stdio.h>
             2 #include<string.h>
             3 #define M 10000000
             4 int prime[M/3],phi[M];
             5 bool flag[M];
             6 void get_prime()
             7 {
             8     int i,j,k;
             9     memset(flag,false,sizeof(flag));
            10     k=0;
            11     for(i=2;i<M;i++){
            12         if(!flag[i]){                            
            13             prime[k++]=i;
            14             phi[i]=i-1;
            15         }
            16         for(j=0;j<k&&i*prime[j]<M;j++){
            17             flag[i*prime[j]]=true;            
            18             if(i%prime[j]==0){
            19                 phi[i*prime[j]]=phi[i]*prime[j];
            20                 break;
            21             }
            22             else
            23                 phi[i*prime[j]]=phi[i]*(prime[j]-1);
            24         }
            25     }
            26 }
            27 int main()
            28 {}

            -----------------------------------------------------------------------我是低調(diào)的分割線-----------------------------------------------------------------------------------------
            求約數(shù)個(gè)數(shù)略微復(fù)雜一點(diǎn),但大體還是那個(gè)意思。
            約數(shù)個(gè)數(shù)的性質(zhì),對(duì)于一個(gè)數(shù)N,N=p1^a1 + p2^a2 + ... + pn^an。其中p1 ,p2, p3... pn是N的質(zhì)因數(shù),a1 ,a2, a2,...an為相應(yīng)的指數(shù),則
                                                                       div_num[N]=(p1+1)*(p2+1)*(p3+1)* ... *(pn+1);
            結(jié)合這個(gè)算法的特點(diǎn),在程序中如下運(yùn)用:
              對(duì)于div_num:

            (1)如果i|prime[j] 那么 div_num[i*prime[j]]=div_sum[i]/(e[i]+1)*(e[i]+2)                  //最小素因子次數(shù)加1
            (2)否則 div_num[i*prime[j]]=div_num[i]*div_num[prime[j]]                                     //滿足積性函數(shù)條件

              對(duì)于e:

            (1)如果i|pr[j]  e[i*pr[j]]=e[i]+1; //最小素因子次數(shù)加1
            (2)否則 e[i*pr[j]]=1;              //pr[j]為1次

             1 #include<stdio.h>
             2 #include<string.h>
             3 #define M 10000000
             4 int prime[M/3],e[M/3],div_num[M];           // e[i]表示第i個(gè)素?cái)?shù)因子的個(gè)數(shù)
             5 bool flag[M];
             6 void get_prime()
             7 {
             8     int i,j,k;
             9     memset(flag,false,sizeof(flag));
            10     k=0;
            11     for(i=2;i<M;i++){
            12         if(!flag[i]){                            
            13             prime[k++]=i;
            14             e[i]=1;
            15             div_num[i]=2;                       //素?cái)?shù)的約數(shù)個(gè)數(shù)為2
            16         }
            17         for(j=0;j<k&&i*prime[j]<M;j++){
            18             flag[i*prime[j]]=true;            
            19             if(i%prime[j]==0){
            20                 div_num[i*prime[j]]=div_num[i]/(e[i]+1)*(e[i]+2);
            21                 e[i*prime[j]]=e[i]+1;
            22                 break;
            23             }
            24             else{
            25                 div_num[i*prime[j]]=div_num[i]*div_num[prime[j]];
            26                 e[i]=1;
            27             }
            28         }
            29     }
            30 }
            31 int main()
            32 {}
            33 
            34 
            35 
            希望大家有所收獲~~                        
             Made by  M.J

            posted on 2010-04-28 16:56 M.J 閱讀(3782) 評(píng)論(11)  編輯 收藏 引用

            評(píng)論

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)[未登錄]  回復(fù)  更多評(píng)論   

            性能如何?
            2010-04-28 17:37 | chaogu

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            線性的,復(fù)雜度在信息學(xué)競(jìng)賽中已經(jīng)相當(dāng)優(yōu)化了。~@chaogu
            2010-04-28 22:50 | M.J

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            沒太看懂,lz說的求前N個(gè)數(shù)的約數(shù)個(gè)數(shù),是指
            拿1 2 3 為例
            1 | 1,1 | 2,1 | 3
            2 | 3,
            3 | 3
            結(jié)果是6?是這意思嗎
            2010-04-29 12:22 | schindlerlee

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            你好。這個(gè)程序是求前N個(gè)數(shù)所有數(shù)的約數(shù)的個(gè)數(shù)。拿M=100來說,程序跑完后可以得到2到100所有數(shù)的約數(shù)個(gè)數(shù)。。~@schindlerlee
            2010-04-29 16:40 | M.J

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            謝謝 研究下你這個(gè)求約數(shù)個(gè)數(shù)的程序 感覺挺有用的 呵呵,如果你這個(gè)模板可以直接用就更好了哈
            2010-05-03 16:20 | abilitytao

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            呵呵,應(yīng)該可以做做成模板,只不過一般比賽應(yīng)該不會(huì)出這么直接的題哈~!不過這個(gè)思想挺有用的,而且這幾個(gè)程序確實(shí)很快。@abilitytao
            2010-05-06 22:59 | M.J

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            好東西,頂~
            2010-07-19 16:13 | dlut_thinkers

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            2: 2
            3: 2
            4: 3
            5: 2
            6: 4
            7: 2
            8: 4
            9: 3
            10: 4
            11: 2
            12: 8
            13: 2
            14: 4
            15: 4
            16: 5
            17: 2
            18: 6
            19: 2
            20: 8
            20的約數(shù)個(gè)數(shù)是不是應(yīng)該是6?
            2010-08-08 17:26 | lzbltx

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)[未登錄]  回復(fù)  更多評(píng)論   

            @lzbltx
            是的。對(duì)了,這個(gè)程序的數(shù)組e[]我開小了,應(yīng)該開M這么大,不是M/3.
            2010-08-17 22:01 | M.J

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            Orz下!
            2010-12-08 22:57 | syx

            # re: 【數(shù)論內(nèi)容】線性篩素?cái)?shù),線性篩歐拉函數(shù),求前N個(gè)數(shù)的約數(shù)個(gè)數(shù)  回復(fù)  更多評(píng)論   

            26行寫錯(cuò)了。。。應(yīng)為e[i*prime[j]]=1;
            2011-08-25 14:58 | xyz

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久久久久久尹人综合网亚洲 | 国产精品VIDEOSSEX久久发布| 亚洲AV无码久久精品狠狠爱浪潮| 亚洲午夜久久久久久久久久 | 久久久久se色偷偷亚洲精品av| 久久精品视频一| 久久99精品久久久久久久久久| 91精品国产91久久久久久蜜臀| 欧美一级久久久久久久大| 久久人人爽人人人人片av| 精品久久一区二区三区| 欧美日韩中文字幕久久久不卡| 日韩精品久久久肉伦网站 | 青青热久久国产久精品 | 久久无码AV一区二区三区| 热re99久久精品国99热| 理论片午午伦夜理片久久| 久久99精品国产自在现线小黄鸭| 久久黄视频| 91久久精品视频| 性做久久久久久久| 三级三级久久三级久久| 国产精品一区二区久久精品无码| 久久久久亚洲AV成人片| 狠狠色丁香久久婷婷综合| 久久婷婷五月综合成人D啪| 久久精品国产亚洲一区二区| 亚洲国产精品成人久久| 久久精品久久久久观看99水蜜桃| 成人精品一区二区久久久| 久久免费的精品国产V∧| 亚洲精品第一综合99久久| 精品国产乱码久久久久久浪潮| 久久国产成人精品麻豆| 国产精品久久久久影院嫩草 | 久久人人爽人人爽人人片AV东京热 | 国内精品久久久久久久亚洲 | 亚洲精品视频久久久| 伊人久久国产免费观看视频| 日本欧美国产精品第一页久久| 久久精品中文字幕有码|