摘抄於《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(intn) 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...