简单的数论函数模板
$\tau\left( n\right) = (n_1+1)(n_2+1)\cdot \cdot \cdot (n_k+1)$
typedef unsigned long long ll;
ll tau(ll n){//除数函数
ll res=1,t=2,p;
while(n>t){
p=1;
while(!(n%t)){
n/=t;
++p;
}
res*=p;
++t;
}
if(n!=1) res<<=1;
return res;
}
//javascript 移植
function tau(n){
var res=1;var t=2;var p;
while(n>t){
p=1;
while(!(n%t)){
n/=t;
++p;
}
res*=p;
++t;
}
if(n!=1) res<<=1;
return res;
}
$\sigma(n)$
除数和函数
typedef unsigned long long ll;
ll sigma(ll n){
ll res=1,t=2,tp;
while(n>t){
tp=t;
while(!(n%t)){
n/=t;
tp*=t;
}
res*=(tp-1)/(t-1);
++t;
}
if(n!=1) res*=n+1;
return res;
}
function sigma(n){
var res=1;var t=2;var tp;
while(n>t){
tp=t;
while(!(n%t)){
n/=t;
tp*=t;
}
res*=(tp-1)/(t-1);
++t;
}
if(n!=1) res*=n+1;
return res;
}
分解质因数(javascript,O(2^(n/2)),同理上面的可以这样优化)
function factor(n){
var res={};var t=2;var p;
while(n>=t*t){
p=0;
while(!(n%t)){
n/=t;
++p;
}
if(p) res[t]=p;
++t;
}
if(n!=1) res[n]=1;
return res;
}

浙公网安备 33010602011771号