• <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, 評論 - 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ì),對于一個(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)用:
              對于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ù)條件

              對于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) 評論(11)  編輯 收藏 引用

            評論

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

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

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

            線性的,復(fù)雜度在信息學(xué)競賽中已經(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ù)  更多評論   

            沒太看懂,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ù)  更多評論   

            你好。這個(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ù)  更多評論   

            謝謝 研究下你這個(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ù)  更多評論   

            呵呵,應(yīng)該可以做做成模板,只不過一般比賽應(yīng)該不會出這么直接的題哈~!不過這個(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ù)  更多評論   

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

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

            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ù)  更多評論   

            @lzbltx
            是的。對了,這個(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ù)  更多評論   

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

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

            26行寫錯(cuò)了。。。應(yīng)為e[i*prime[j]]=1;
            2011-08-25 14:58 | xyz
            99久久精品无码一区二区毛片| 欧美午夜A∨大片久久| 亚洲av成人无码久久精品| 久久夜色精品国产噜噜噜亚洲AV| 蜜臀av性久久久久蜜臀aⅴ麻豆| 天天躁日日躁狠狠久久| 久久精品九九亚洲精品天堂| 久久久久亚洲精品天堂久久久久久 | 99久久免费国产精品热| 国产精品成人99久久久久91gav| 四虎亚洲国产成人久久精品| 97久久天天综合色天天综合色hd | 蜜臀av性久久久久蜜臀aⅴ| 91精品国产91久久综合| 亚洲午夜久久久| 天天久久狠狠色综合| 综合人妻久久一区二区精品| 青青国产成人久久91网| 人妻精品久久无码专区精东影业| 久久人人爽人人爽人人片AV麻豆| 中文无码久久精品| 午夜视频久久久久一区 | 久久一区二区三区免费| 久久国产精品-久久精品| 熟妇人妻久久中文字幕| 天堂无码久久综合东京热| 国内精品欧美久久精品| 91久久福利国产成人精品| 无码人妻精品一区二区三区久久| 亚洲欧美一级久久精品| 久久国产成人亚洲精品影院| 88久久精品无码一区二区毛片| 国产精品久久久久…| 久久亚洲美女精品国产精品| 久久亚洲AV成人无码软件| 亚洲国产成人精品91久久久 | 亚洲午夜久久久久久久久电影网 | 97久久超碰国产精品2021| 久久精品中文騷妇女内射| 五月丁香综合激情六月久久| 伊人久久大香线蕉av不卡|