• 找新朋友


    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;

    }
    }
  • 相关阅读:
    windows下Redis安装及使用
    DQL、DML、DDL、DCL的概念与区别
    成长路上破局思维:工具化时间管理
    git push 本地分支与远程分支关联
    vue elementUI table表格列动态渲染的案例
    flutter 页面频繁刷新节省页面性能的组件RepaintBoundary
    elementUI Table表格表头自定义
    vue 项目添加echarts图表
    flutter 高斯实现模糊
    flutter 监听软键盘的弹出和关闭
  • 原文地址:https://www.cnblogs.com/aboutblank/p/2137762.html
Copyright © 2020-2023  润新知