素数筛, 扩展欧几里得,欧拉函数模板

素数筛

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);
		}
}

猜你喜欢

转载自blog.csdn.net/bpdwn2017/article/details/81165108