含义:σ(n)表示从1到n(包含)的所有n 的因数之和。
积性:如果gcd(n, m) = 1,有σ(nm) = σ(n) * σ(m)
求值公式:
特别地:
代码:
#include <iostream>
using namespace std;
const int LIM = 1e7;
int prime[LIM];
int pos;
bool notPrime[LIM];
void Euler() {
for (int i = 2; i < LIM; i++) {
if (!notPrime[i]) prime[pos++] = i;
for (int j = 0; j < pos; j++) {
int tmp = prime[j] * i;
if (tmp >= LIM || tmp < 0) break;
notPrime[tmp] = true;
}
}
}
int fastPow(int b, int p) {
int ret = 1;
while (p) {
if (p & 1) ret *= b;
b *= b;
p >>= 1;
}
return ret;
}
// sigma因数和函数
int sigma(int n) {
int ret = 1;
for (int i = 0; i < pos && n > 1; i++) {
int cnt = 0;
while (!(n % prime[i])) n /= prime[i], cnt++;
if (cnt) ret *= (fastPow(prime[i], cnt + 1) - 1) / (prime[i] - 1);
}
return ret;
}
int main(void) {
Euler();
int t, n;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
printf("%d\n", sigma(n) - n);
}
return 0;
}
依赖:
-欧拉线性筛素数函数
-快速幂(逐次平方法)函数