初等數論入門(搬運)
作者:互联网
#define maxp 65536
#define ll long long
int primes[maxp];
bool notprime[maxp]; // 1
void Eratosthenes() {
notprime[1] = true;
primes[0] = 0;
for (int i = 2; i < maxp; i++) {
if (!notprime[i]) {
primes[++primes[0]] = i; // 2
for (ll j = (ll)i*i; j < maxp; j += i) {
notprime[j] = true; // 3
}
}
}
}
struct factor {
int prime, count;
factor() {}
factor(int p, int c) : prime(p), count(c) {}
};
void Factorization(int n, vector <factor>& ans) {
ans.clear();
if (n == 1) {
return;
}
for (int i = 1; i <= primes[0]; i++) {
if (0 == n % primes[i]) {
factor f(primes[i], 0);
while (0 == n % primes[i]) {
n /= primes[i];
f.count++;
}
ans.push_back(f);
}
if (n == 1) {
return;
}
}
ans.push_back(factor(n, 1));
}
const int MAX_NUMBER = 10000010;
const int MAXP = 3163; // (int)(sqrt(MAX_NUMBER*1.0) + 1);
#define LL long long
bool notprime[MAX_NUMBER];
int primes[MAXP];
int eula[MAX_NUMBER];
void eulaFilter() {
int i, j;
notprime[1] = 1;
eula[1] = 1;
// 1.枚举每个数
for (i = 2; i < MAX_NUMBER; ++i) {
if (!notprime[i]) {
// 2.素数i的欧拉函数i-1
eula[i] = i - 1;
if (i < MAXP) {
primes[++primes[0]] = i;
}
for (j = i + i; j < MAX_NUMBER; j += i) {
notprime[j] = 1;
// 3.非素数的欧拉函数为本身*素数分量(1-1/i)的乘积
if (!eula[j]) eula[j] = j;
eula[j] = eula[j] / i*(i - 1);
}
}
}
}
标签:eula,notprime,int,MAX,入門,搬運,NUMBER,primes,數論 来源: https://www.cnblogs.com/sixiaoxiaoya/p/16339412.html