• BZOJ2190:[SDOI2008]仪仗队(欧拉函数)


    Description

      作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。      现在,C君希望你告诉他队伍整齐时能看到的学生人数。

    Input

      共一个数N。

    Output

      共一个数,即C君应看到的学生人数。

    Sample Input

      4

    Sample Output

      9

    HINT

    【数据规模和约定】   对于 100% 的数据,1 ≤ N ≤ 40000

    Solution

    首先设左下角坐标为(0,0)
    那么很容易发现:
    一个人如果是不可视的,那么他的坐标(x,y)一定含有公约数k
    使得一个人(x/k,y/k)可以挡住他。
    那么只要一个人的横纵坐标互质,就是可以被看见的
    那么问题就转化成了对于每个1~n中的数,有多少个1~n的数与其互质
    然后我们又可以发现答案关于(0,0)->(n,n)轴对称
    所以我们只算一半即可。
    然后就可以把问题转化为求和欧拉函数的φ(1)~φ(n)了
    注意n=1的时候特判一下

    Code

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int ans,n,phi[40005];
     5 
     6 void Euler()
     7 {
     8     phi[1]=1;
     9     for (int i=2;i<=40000;++i)
    10         if (!phi[i])
    11             for (int j=i;j<=40000;j+=i)
    12             {
    13                 if (!phi[j]) phi[j]=j;
    14                 phi[j]=phi[j]/i*(i-1);
    15             }
    16 }
    17 
    18 int main()
    19 {
    20     scanf("%d",&n);
    21     Euler();
    22     for (int i=1;i<n;++i)
    23         ans+=phi[i];
    24     printf("%d",ans*2+(n!=1));
    25 }
  • 相关阅读:
    349. 两个数组的交集
    383. 赎金信
    242. 有效的字母异位词
    844. 比较含退格的字符串
    904. 水果成篮
    剑指offer(9)变态跳台阶
    剑指offer(8)跳台阶
    剑指offer(7)斐波那契数列
    剑指offer(6)旋转数组的最小数字
    剑指offer(5)用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/refun/p/8776284.html
Copyright © 2020-2023  润新知