这道题应用到高斯函数,学习了怎样用筛法编程求出高斯函数,很好很强大。以前也接触过筛法,这次学习了筛法的优化实现,嘎嘎~
所谓正整数n的欧拉函数,是指小于等于(其实“等于”也只有在n=1时才用得到)n的所有正整数(即1,2,...,n)中与n互质的数的个数。如1的欧拉函数值为1(1和1属于互质~),2的欧拉函数值为1(因为只有1与其互质),而4的欧拉函数值为2(因为有1,、3两个数与其互质)。
正整数n的欧拉函数φ的通式为:φ(n)=n(1-1/p1)(1-1/p2)...(1-1/pm),其中p1, p2, ..., pm为n的所有质因数,如12=2*2*3,故其质因数为2、3。编程求欧拉函数的具体实现可参见下面的代码(参考了网络资源~)。
code:
#include <stdio.h>
#include <stdlib.h>
#define N 1000000
//poj2478
static char prime[N + 1];
static __int64 ans[N + 1];
int main()
{
int i, j, n;
prime[0] = prime[1] = 0;
for (i=2; i<=N; i++)
prime[i] = 1;
for (i=2; i*i<=N; i++)
{
if (prime[i])
{
for (j=i*i; j<=N; j+=i)
prime[j] = 0;
}
}
for (i=1; i<=N; i++)
ans[i] = i;
for (i=2; i<=N; i++)
{
if (prime[i])
{
for (j=i; j<=N; j+=i)
ans[j] = ans[j] / i * (i - 1);
}
}
for (i=3; i<=N; i++)
ans[i] += ans[i - 1];
// printf("ok\n");
scanf("%d", &n);
while (n != 0)
{
printf("%I64d\n", ans[n]);
scanf("%d", &n);
}
return 0;
}