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

    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

    这题目可以直接用初等数论里的欧拉公式,所有小于N的正整数里,和N互素的整数的个数。

    /*
    欧拉φ函数:φ(n)是所有小于n的正整数里,和n互素的整数的个数。n是一个正整数。   
    欧拉证明了下面这个式子:   
    如果n的标准素因子分解式是p1^a1*p2^a2*……*pm^am,其中众pj(j=1,2,……,m)都是素数,而且两两不等。
    则有   φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm)   
    利用容斥原理可以证明它。
    */

    #include
    <iostream>
    #include
    <cmath>
    using namespace std;
    int euler(int x)
    {
    // 就是欧拉公式
    int i, res=x;
    for (i = 2; i < (int)sqrt(x * 1.0) + 1; i++)
    if(x%i==0)
    {
    res
    = res / i * (i - 1);
    while (x % i == 0) x /= i; // 保证i一定是素数
    }
    if (x > 1) res = res / x * (x - 1);
    return res;
    }
    int main(void)
    {
    int n;
    cin
    >>n;
    while(n--)
    {
    int a;
    cin
    >>a;
    cout
    <<euler(a)<<endl;

    }
    }
  • 相关阅读:
    【vim使用】替换文本
    Ubuntu中将vim中查找设置为高亮
    【vim使用】查找文本
    【vim使用】缩进 和 重复执行上一次命令
    【vim使用】替换命令
    【vim使用】复制和粘贴
    【vim使用】撤销和恢复撤销
    【vim使用】删除文本
    【vim使用】选中文本(可视模式)
    【vim使用】利用标记返回之前需要编辑的代码位置
  • 原文地址:https://www.cnblogs.com/aboutblank/p/2137762.html
Copyright © 2011-2022 走看看