POJ 2407 Relatives

Relatives
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 14350 Accepted: 7175

Description

Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.

Input

There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.

Output

For each test case there should be single line of output answering the question posed above.

Sample Input

7
12
0

Sample Output

6

4

这个题拿到后,第一反应是开循环,用镶嵌循环写,但是看到数据的大小1,000,000,000。太大了,因为我们知道,一般计

算机的运算速度大约在10^7-10^8次/s之间开镶嵌循环肯定超时,所以就去discuss里面看了看,有很多大佬说这题要用欧拉公

式,于是我就去网上找了几篇关于欧拉的博客。下面引用一段:

要计算一个正整数n的欧拉函数的方法如下:1. 将n表示成素数的乘积: n = p1 ^ k1 * p2 ^ k2 * ... * pn ^ kn(这里p1, p2, ..., pn是素数)2. PHI(n) = (p1 ^ k1 - p1 ^ (k1 - 1)) * (p2 ^ k2 - p2 ^ (k2 - 1)) * ... *(pn ^ kn - pn ^ (kn - 1))              = Mult { pi ^ ki - pi ^ (ki -1) }

看了许久方才弄明白这个公式,借鉴了一些别人博客里面的欧拉函数,尝试性的写了以下代码

#include <stdio.h>
int main()
{
    long long n;
    while(scanf("%lld",&n)!=EOF&&n)
    {
        long long t=n;
        for(int i=2; i*i<=n; i++)
        {
            if(n%i==0)
            {
                t=t/i*(i-1);        //相当于一个递推公式其函数原型没变
                while(n%i==0)
                    n/=i;           //除去这个数中含有的所有的该因子
            }
        }
        if(n>1) t=t/n*(n-1);        //处理特殊情况的数
        printf("%d\n",t);
    }
    return 0;
}


一次AC。但还是得好好理解,这题以后还会来看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值