Poj(2407),Greater New York Regional 2015 (D)

题目链接:http://poj.org/problem?id=2407

Relatives

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13599   Accepted: 6772

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

Source

Waterloo local 2002.07.01

两道题差不多的结题思路,都是求一个数的互质的数的个数。用欧拉函数。

欧拉函数:

一个数x的素因数p1,p2,p3,......,那么他的欧拉函数就为x(1-1/p1)(1-1/p2)(1-1/p3)......
欧拉函数相当于一个筛选,找到一个素因数后,就将该素因子全部约掉。

然后Greater New York Regional 2015 (D)中,1是一个特例,他有0/1,1/1两个互质的数,所以ans[1] = 2;

然后再打表就可以了。

#include <stdio.h>

int Euler(int n)
{
    int ans = n;
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            n/=i;
            ans = ans - ans/i;

            while(n%i==0)
            {
                n/=i;
            }

        }
    }
    if(n>1) ans = ans - ans/n;
    return ans;
}

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        printf("%d\n",Euler(n));
    }
    return 0;
}

#include <stdio.h>

int Euler(int n)
{
    int res = n;
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            n=n/i;
            res = res - res/i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1) res = res - res/n;
    return res;
}

int main()
{
    int cases;
    scanf("%d",&cases);

    int ans[10005];
    ans[1] = 2;
    for(int i=2; i<=10000; i++)
    {
        ans[i]=ans[i-1]+Euler(i);
    }
    while(cases--)
    {
        int t,k;
        scanf("%d%d",&t,&k);
        printf("%d %d\n",t,ans[k]);
    }
    return 0;
}

时间: 2025-01-12 02:43:07

Poj(2407),Greater New York Regional 2015 (D)的相关文章

2018 ICPC Greater New York Regional Contest E What time is it anyway?(暴搜)

What time is it anyway? 524288K The \text{Frobozz Magic Clock Company}Frobozz Magic Clock Company makes 12-hour analog clocks that are always circular and have an hour hand and a minute hand as shown below: The shop has NN clocks all possibly showing

[POJ 2407]Relatives(欧拉函数)

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

POJ 2407 Relatives 欧拉函数题解

最基本的欧拉函数: 欧拉函数:求小于n的与n互质的个数 欧兰函数公式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)-..(1-1/pn),其中p1, p2--pn为x的所有质因数 就是要求这样的式子啦,不过求这条式子,相信有很多种方法可以求,这个不是难题: 不过问题是如何巧妙地求,如何简洁地写出代码. 直接硬求,或者求出质因数之后求都不是巧妙的方法了,参考了下别人的代码才知道可以写的这么巧妙的. 下面程序可以说是连消带打地求式子结果,分解质因子,可以如此简明地把解

树的点分治 (poj 1741, 1655(树形dp))

poj 1655:http://poj.org/problem?id=1655 题意: 给无根树,  找出以一节点为根,  使节点最多的树,节点最少. 题解:一道树形dp,先dfs 标记 所有节点的子树的节点数. 再dfs  找出以某节点为根的最大子树,节点最少. 复杂度(n) /***Good Luck***/ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cs

Poj(1220),hash

题目链接:http://poj.org/problem?id=1200 这个题,我真是无限MLE,RE,WA,太伤心了,还是写一下吧.题意很简单(英语很好读),最后看了一下金海峰的思路.果然,应该是我的这个hash表有点问题,最好是用正确的算法吧,不乱创造了.karp-rabin把字符串转化成数字的算法,一个字符串有n种字符构成,把每种字符对应为0-n-1中的一个数字,把字母换成对应的数字之后,对于固定长度的串,每个串都与一个唯一的n进制数对应.这样就可以hash了. #include <ios

poj 1780 , poj 1392 欧拉回路求前后相互衔接的数字串

两道题目意思差不多 第一题是10进制 , 第二题是2进制的 都是利用欧拉回路的fleury算法来解决 因为我总是希望小的排在前面,所以我总是先将较小数加入栈,再利用另一个数组接收答案,但是这里再从栈中导出来答案要倒一下了,这一点要注意 poj 1780 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 using namespace std; 5 #define N 1000010 6 7 int

poj 5024&amp;&amp;&amp;2014 ACM/ICPC Asia Regional Guangzhou Online 1003(预处理)

http://acm.hdu.edu.cn/showproblem.php?pid=5024 分析:预处理每个点在八个方向的射线长度,再枚举八种L形状的路,取最大值. 注意题意是求一条最长路,要么一条直线,要么只有一个90角,即L型.其实直线就是L形的一个方向长度为0. 代码: #include<iostream> #include<map> #include<cstdio> #include<string> #include<cstring>

PoJ(2263),Floyd,最小值中的最大值

题目链接:http://poj.org/problem?id=2263 题意:题中给出相连通不同城市之间的载货量,要求找到一条从指定起点到终点的路径,并满足载货量最大. #include <iostream> #include <cstdio> #include <cstring> #include <string> using namespace std; const int POINT = 210; int dis[POINT][POINT]; stri

Poj(3615),Floyd,最大值中的最小值

题目链接:http://poj.org/problem?id=3615 题意:大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度).从x跳跃到y的路径消耗的体力值是路径中的一个最大高度差.求一条消耗体力最小的路径. #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f int dis[350][