喵哈哈村小学上课啦(欧拉函数)

喵哈哈村小学上课啦

发布时间: 2017年5月23日 20:20   最后更新: 2017年5月23日 20:20   时间限制: 1000ms   内存限制: 128M

数学课上,小学生刚学会了乘除法。老师问了他们一系列这样的问题:给一个正整数N,答案要为小于N的正整数,比如N = 4,

                   老师会问:1乘以几除以4余1?

                   小学生回答:1!

                   老师继续问:2乘以几除以4余1?

                   小学生回答:没有!

                   老师继续问:3乘以几除以4余1?

                   小学生回答:3!

月亮是众小学生之一,他觉得这个问题太简单了,于是就想,对于一个N,如果老师从1 问到 N-1(乘以几除以N余1),那么所有答案的和是多少,如果答案是”没有”则认为答案是0。 

一个整数 T,表示数据组数

之后的T行,每行一个整数N

2 <= N <= 1000000000,T <= 10。

共T行,每行一个整数,表示和

  复制
1
4
4

欧拉函数:

目的:

对于正整数x,求小于x的数中与x互质的数的数目

公式:

ϕ(x) = x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn)

其中p1,p2…pn为x的所有质因数

性质:

①一个数的所有与其互质的数之和是ϕ(n)*n/2

②如果n和m互质,那么φ(mn) = φ(n)*φ(m)

③若n是质数p的k次幂(即n=p^k),φ(n) = p^k-p^(k-1)= (p-1)*p^(k-1)

④若n和p互质,那么n^φ(p)%p==1

⑤当n>=2时,φ(p)一定为偶数

(好怀念,想想欧拉函数可是我接触ACM后学的第一个新知识)


#include<stdio.h>
#define LL long long
int main(void)
{
	LL ans;
	int T, n, i, temp;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &n);
		temp = ans = n;
		for(i=2;i*i<=n;i++)
		{
			if(n%i==0)
				ans = ans*(i-1)/i;
			while(n%i==0)
				n /= i;
		}
		if(n!=1)
			ans = ans*(n-1)/n;
		printf("%lld\n", ans*temp/2);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值