• 【Foreign】Uria [欧拉函数]


    Uria

    Time Limit: 20 Sec  Memory Limit: 512 MB

    Description

      从前有个正整数 n。

      对于一个正整数对 (a,b),如果满足 a + b ≤ n 且 a + b 是 a * b 的因子,则成为神奇的数对。

      求神奇的数对的个数。

    Input

      一行一个正整数 n。

    Output

      一行一个整数表示答案,保证不会超过 64 位有符号整数类型的范围。

    Sample Input

      21

    Sample Output

      11

    HINT

      n ≤ 1e14

    Solution

      

    Code

     1 #include<iostream>    
     2 #include<string>    
     3 #include<algorithm>    
     4 #include<cstdio>    
     5 #include<cstring>    
     6 #include<cstdlib>
     7 #include<cmath>
     8 using namespace std;  
     9 typedef long long s64;
    10 typedef unsigned int u32;
    11  
    12 const int ONE = 1e7 + 5;
    13 const u32 MOD = 20000116;
    14 
    15 s64 n, Q;
    16 s64 Ans;
    17 bool isp[ONE];
    18 s64 phi[ONE], prime[ONE], p_num;
    19 
    20 int get()
    21 {    
    22         int res=1,Q=1;char c;    
    23         while( (c=getchar())<48 || c>57 ) 
    24         if(c=='-')Q=-1; 
    25         res=c-48;     
    26         while( (c=getchar())>=48 && c<=57 )    
    27         res=res*10+c-48;
    28         return res*Q;
    29 }
    30 
    31 void Get_phi(int MaxN)
    32 {
    33         phi[1] = 1;
    34         for(int i = 2; i <= MaxN; i++)
    35         {
    36             if(!isp[i])
    37                 prime[++p_num] = i, phi[i] = i - 1;
    38             for(int j = 1; j <= p_num && i * prime[j] <= MaxN; j++)
    39             {
    40                 isp[i * prime[j]] = 1;
    41                 if(i % prime[j] == 0)
    42                 {
    43                     phi[i * prime[j]] = phi[i] * prime[j];
    44                     break;
    45                 }
    46                 phi[i * prime[j]] = phi[i] * phi[prime[j]];
    47             }
    48         }
    49 }
    50 
    51 int main()
    52 {
    53         cin>>n;    Q = sqrt(n);    
    54         Get_phi(Q);
    55         for(int i = 2; i <= Q; i++)
    56             Ans += (n / i / i) * phi[i];
    57         printf("%lld", Ans); 
    58 }
    View Code
  • 相关阅读:
    反射
    如何通过反射调用对象的方法?
    简述一下面向对象的”六原则一法则”。
    用Java写一个单例类。
    什么是UML?
    UML中有哪些常用的图?
    用Java写一个折半查找。
    两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
    构造器(constructor)是否可被重写(override)?
    用最有效率的方法计算2乘以8?
  • 原文地址:https://www.cnblogs.com/BearChild/p/7617759.html
Copyright © 2020-2023  润新知