喵哈哈村小学上课啦
发布时间: 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;
}