zoukankan      html  css  js  c++  java
  • HDU1286 找新朋友

    题目链接:点击打开题目

    找新朋友

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 14912    Accepted Submission(s): 7939


     

    Problem Description

    新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。

    Input

    第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。

    Output

    对于每一个N,输出一行新朋友的人数,这样共有CN行输出。

    Sample Input

    
     

    2 25608 24027

    Sample Output

    
     

    7680 16016

    思路:一眼看过去,以为是筛选素数,后来发现不是,然后就用gcd暴力跑(TLE)。然后一直找gcd和素数筛选后的关系,最后翻书看数论,突然看到了欧拉函数,想到了欧拉函数就是这个功能。

    推荐博客链接

    AC代码:

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    long long eular(long long n)//欧拉函数板子 
    {
        long long ans = n;
        for(int i = 2;i*i <= n;i++)
        {
            if(n % i == 0)//第一个素因子
            {
                ans -= ans/i;
                while(n % i == 0)//约去因子
                    n /= i;
            }
        }
        if(n > 1)ans -= ans/n;
        return ans;
    }
    
    int main()
    {
        int n, x;
        scanf("%d", &n); 
        while(n--)
        {
        	scanf("%d", &x);
            int ret = eular(x);
            printf("%d
    ",ret);
        }
        return 0;
    }
  • 相关阅读:
    第13周学习进度情况
    【Android进阶】获取Android软件的版本信息
    【Android进阶】Android程序与JavaScript之间的简单调用
    字符串长度
    约瑟夫问题
    输入n个数和输出调整后的n个数
    输入三个整数,按由小到大的顺序输出
    学校oj平台上不去
    输入10个整数
    输入三个字符串,按由小到大的顺序输出
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/9572960.html
Copyright © 2011-2022 走看看