因子和與因子個數

2022-08-15 05:03:16 字數 3020 閱讀 8122

摘抄於《acm-icpc 程式設計系列數論及應用》

基本理論

定義1:因子和函式σ定義為整數n的所有正因子之和,記為σ(n).

定義2:因子個數函式τ定義為正整數n的所有正因子個數,記為τ(n).

定理 定理1:如果f是積性函式f(n),那麼f的和函式f(n)=σ(d|n)  f(d) 也是積性函式

推論:因子和函式σ與因子個數函式τ是積性函式(只要令 f(n)=n  和f(n)=1即可)

定理2:設p是乙個素數,a是乙個正整數,那麼

σ(pa)=1+p+p2+p3+..+pa= (pa+1-1)/(p-1)  (等比數列求和公式可得)

τ(pa)=a+1;      (pa的因子為 1 ,p,p2,p3,...pa)

定理3:設正整數n有素因子分解n=p1

a1*p2

a2*.....ps

as (唯一分解定理)

σ(n)= (p1

a1+1-1)/(p1-1) * (p2

a2+1-1)/(p2-1) *(ps

as+1-1)/(ps-1)  = π( j=1,s)  (pj

aj+1-1)/(pj-1) (由定理2得)

τ(n)=(a1+1)*(a2+1)*...*(as+1)= π( j=1,s) (aj+1)

**實現:

因為求因子和函式與因子個數函式同求尤拉函式值一樣,都需要素因子分解。**寫法寫法大致一樣。

求因子和:

int sum(int

n) s=s*(a*i-1)/(i-1

); }

}if(n>1

) s=s*(1+n);

return

s;}

求因子個數:

ll count(ll n)

s=s*(num+1

); }

}if(n>1

) s=s*2

;

return

s;}

實戰:poj 2992(因子個數):求出c(k,n)因子個數  (0<=k<=n<=431)

思路:如果直接求組合數是不可能的因為,其太大了。

要求因數個數,以上可知,要先求素因子,所以要素因子分解,組合數可以寫成階乘的形式,那可以階乘素因子分解,求階乘對於每個素因子可分解的個數。

步驟:1.先篩出431內的素數。

2.對每個階乘進行素因子分解

3.根據上面的定理求因子個數

#include#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;bool isprime[450

];int

nprime;

int prime[100

];void init()//

篩出431內所有的素數

}}int

main()

ll c[

450][450

];

for(int i=2;i<450;i++) }}

intn,k;

while(scanf("

%d%d

",&n,&k)!=eof)

return0;

}

poj 1845(求因子和):求 ab%9901,(0<=a,b<=50000000)

思路:對於a素因子分解為a=p1

k1*p2

k2*...*pm

km,那麼ab=p1

k1b*p2

k2b*...*pm

kmb因為積性函式的性質,s=(1+p1+p1

2+...+p1

k1b) * (1+p2+p2

2+..+p2

k2b)*...*(1+pm+pm

2+..+pm

kmb)

由等比數列求和得:s=(p1

k1b+1-1)/(p1-1) * (p2

k2b+1-1)/(p2-1) *...* (pm

kmb+1-1)/(pm-1)

依然要素因子分解,這裡用二維陣列su用於存素因子和其個數,su[i][0]表示第i個素因子為多少,su[i][1]表示其個數。

再根據推導公式求即可,但是除數(p-1)是不能取模的,要變成乘以逆元,因為9901是素數,直接用費馬小定理即可

#include#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

typedef

long

long

ll;ll mul(ll x,ll y)

//快速冪

return

ans;

}int

main()

p++;}}

if(a>1

)

for(int i=0;i//

記得素因子個數是 k*b+1

ll m=1

; ll x,y;

for(int i=0;i)

m=m*(mul(su[i][0],su[i][1])-1)%9901;//

p^(k*b+1)-1

x=mul(su[i][0]-1,9899)%9901;//

費馬小定理,求(p-1)的逆元

x=(x%9901+9901)%9901;//

一項素因子的值

m=m*x%9901

; }

printf(

"%lld\n

",m);}}

return0;

}

求因子和與因子個數

求因子和與因子個數 包含1和本身 所有因子個數 n 與所有因子的和 n 都是乘 積 性函式。定義1 因子和函式 定義為整數n的所有正因子之和,記為 n 定義2 因子個數函式 定義為正整數n的所有正因子個數,記為 n 定理1 設p是乙個素數,a是乙個正整數,那麼 n 1 p p 2 p a p a 1...

因子和因子個數

所有因子個數 n 與所有因子的和 n 都是乘 積 性函式。定義1 因子和函式 定義為整數n的所有正因子之和,記為 n 定義2 因子個數函式 定義為正整數n的所有正因子個數,記為 n 定理1 設p是乙個素數,a是乙個正整數,那麼 n 1 p p 2 p a p a 1 1 p 1 n a 1 定理2 ...

因子個數以及因子和

高度可約的三角形數 三角形數數列是通過逐個加上自然數來生成的。例如,第7個三角形數是 1 2 3 4 5 6 7 28。三角形數數列的前十項分別是 1,3,6,10,15,21,28,36,45,55,讓我們列舉出前七個三角形數的所有約數 1 1 3 1,3 6 1,2,3,6 10 1,2,5,1...