hdu3501 欧拉函数(或容斥原理(莫比乌斯函数))

本文提供两种解决HDU 3501问题的方法:一是利用容斥原理结合莫比乌斯函数;二是通过欧拉函数计算与特定整数互质的不同整数的数量,并给出第二种方法的实现代码。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3501

题解1:显然,本体可以用容斥原理,求出每个数的倍数情况,其系数就是莫比乌斯函数。

题解2:对于整数n,如果x(x<n)与n互质,那么(n-x)也与n是互质的;同理如果x(x<n)与n不互质,那么(n-x)也与n是不互质的。知道这个之后就可以得出:在0<x<n时,存在这样的x与n互质的个数假设为num(可以通过欧拉函数求得),那么所有与n互质的x的和sum=num*n/2.

题解2代码如下:

#include  <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 10;
const int MOD = 1000000007;
int primes[maxn],pcnt;
int vis[maxn];
ll n;
void get_prime(int n){
	vis[1] = 1;
	for(int i = 2;i <= n;i++){
		if(!vis[i]) primes[++pcnt] = i;
		for(int j = 1;j <= pcnt && primes[j] * i <= n;j++){
			vis[i * primes[j]] = 1;
			if(i % primes[j] == 0) break;
		}
	}
}
int main()
{
	get_prime(maxn - 10);
	while(~scanf("%lld",&n) && n){
		ll phi = n,tmp = n;
		for(int i = 1;i <= pcnt;i++){
			ll t = primes[i];
			if(t * t > n) break;
			if(n % t == 0) {
				phi = phi / t * (t - 1);
				while(n % t == 0) n/=t;
			}
		}
		if(n > 1) phi = phi / n * (n - 1);
		ll ans = (long long)phi * tmp / 2;
		ans = (tmp * (tmp - 1)) / 2 - ans;
		printf("%lld\n",ans % MOD);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值