为什么这样求欧拉函数不对?
查看原帖
为什么这样求欧拉函数不对?
1380473
ZY_202301005129楼主2024/8/25 12:30

我的对比了我的代码和题解的代码,唯一不一样的就是求解n为不同值时采用的方法不同。题解的代码优化得看不出人样了,但是我的代码是严格按照欧拉函数的定义做出来的,所以错在哪?

#include <bits/stdc++.h>
using namespace std;
int su[40001];
int su1[201], su11;
struct d
{
	int x;
	int y;
};
int qm(int a, int n)//快速幂
{
	if (!n)return 1;
	int sum = 1;
	while (n)
	{
		if(n&1)

		sum *= a;
		a = a * a;
		n >>= 1;
	}
	return sum;
}
int main()
{
	int n;cin >> n;
	if (n == 1)
	{
		cout << 0;
		return 0;
	}
	if (n == 2)//特判
	{
		cout << 3;
		return 0;
	}
	for (int i = 2;i <= 200;i++)//打素数表
	{
		if (!su[i])su1[++su11] = i;
		for (int j = 1;j <= su11;j++)
		{
			if (su1[j] * i <= 40000)
			{
				su[su1[j] * i] = 1;
				if (i % su1[j] == 0)break;
			}
			else break;
		}
	}
	long long sum = 0;
	for (int i = 2;i <= n-1;i++)
	{
		if (su[i] == 0)
		{
			sum += i-1;
			continue;
		}
		vector<d> a;
		int i1 = i;
		for (int j = 1;j <= su11;j++)//这一块为欧拉函数////////////////////
		{
			if (i1 % su1[j] == 0)
			{
				int sum = 0;
				while (i1 % su1[j] == 0 && i1)
					i1 /= su1[j], sum++;
				a.push_back({ su1[j],sum });
			}
		}
		for (int j = 0;j < a.size();j++)
			sum += qm(a[j].x, a[j].y - 1) * (a[j].x - 1);////////////////////
	}
	cout << sum * 2 + 3;
}
2024/8/25 12:30
加载中...