欧拉函数的sigma函数

当p是素数且k>=1的情况下:

\phi (p^{k})=p^{k}-p^{k-1}

并且如果gcd(m,n)=1,则\phi (m\cdot n)\phi (m) \phi(n)

方法二:

代码如下:

//欧拉函数的sigma函数
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
typedef long long ll;
vector<ll> notprime;
vector<ll> prime;
void getprime(int n)
{
	notprime.resize(n + 1, 0);
	for (ll i = 2; i <= n; i++)
	{
		if (notprime[i] == 0)
		{
			for (ll j = 2; i * j <= n; j++)
			{
				notprime[i * j] = 1;
			}
		}
		if (notprime[i] == 0)
		{
			prime.push_back(i);
		}
	}
}
int main()
{
	while(1)
	{
		int n;
		int m;
		cout << "是否为平方形式?" << endl;
		int judge;
		cin >> judge;
		if (judge)
		{
			cin >> n >> m;
			ll s = pow(n, m);
			getprime(s);
			bool j=false;
			//此公式前提:n为素数
			for (ll f = 0; f < prime.size() && n >= prime[f]; f++)
			{
				if (n == prime[f])
				{
					j = 1;
					break;
				}
			}
			if (j)
			{
				cout << pow(n, m) - pow(n, m - 1) << endl;
			}
			//否则只能用这个公式
			else
			{
				vector<ll> dp;
				for (ll i = 0; i < prime.size(); i++)
				{
					if (s % prime[i] == 0)dp.push_back(prime[i]);
				}
				double sum = s;
				for (ll i = 0; i < dp.size(); i++)
				{
					sum *= 1.0 - (1.0 / dp[i]);
				}
				cout << sum << endl;
			}
		}
		else
		{
			cin >> n;
			getprime(n);
			vector<ll> dp;
			for (ll i = 0; i < prime.size(); i++)
			{
				if (n % prime[i] == 0)dp.push_back(prime[i]);
			}
			double sum = n;
			for (ll i = 0; i < dp.size(); i++)
			{
				sum *= 1.0 - (1.0 / dp[i]);
			}
			cout << sum << endl;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值