因数分解
typedef long long ll;
#define pli pair<ll, ll>
vector<pli> factor;
void init(ll n) {
factor.clear();
for (ll i = 2; i * i <= n; i++) {
if (n % i == 0) {
factor.emplace_back(i, 0);
for (; n % i == 0; n /= i) factor.back().second++;
}
}
if (n > 1) factor.emplace_back(n, 1);
}
typedef long long ll;
#define pll pair<ll, ll>
vector<pll> factor;
void init(ll n) {
factor.clear();
for (int i = 0; 1ll * prime[i] * prime[i] <= n && i < tot; i++) {
if (n % prime[i] == 0) {
factor.emplace_back(prime[i], 0);
for (; n % prime[i] == 0; n /= prime[i]) factor.back().second++;
}
}
if (n > 1) factor.emplace_back(n, 1);
}
欧拉筛
const int maxn = 1e6 + 1000;
int prime[maxn] = { 0 }, phi[maxn] = { 0 }, tot = 0;
void euler() {
phi[1] = 1;
for (int i = 2; i < maxn; i++) {
if (!phi[i]) {
prime[tot++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < tot && i * prime[j] < maxn; j++) {
if (i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
}