素数筛
void sieve(int n) {
int m = (int)sqrt(n+0.5);
memset(vis, 0, sizeof(vis));
for (int i = 2; i <= m; i++) if (!vis[i])
for (int j = i*i; j <= n; j+=i) vis[j] = 1;
}
生成素数表
int gen_primes(int n) {
sieve(n);
int c = 0;
for (int i = 1; i <= n; i++) if (!vis[i])
prime[c++] = i;
return c;
}
唯一分解定理(求数的因子个数)
long long ans = 1;
for (int i = 1; i < cnt && 1LL*prime[i]*prime[i] <= a; i++)
{
if (a % prime[i] == 0)
{
int num = 0;
while (a % prime[i] == 0)
{
num++;
a /= prime[i];
}
ans *= (num + 1);
}
}