zoukankan      html  css  js  c++  java
  • [SDOi2012]Longge的问题

    题目描述

    Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

    输入输出格式

    输入格式:

    一个整数,为N。

    输出格式:

    一个整数,为所求的答案。

    输入输出样例

    输入样例#1:
    6
    输出样例#1:
    15

    说明

    对于60%的数据,0<N<=2^16

    对于100%的数据,0<N<=2^32

    题解

    求所有GCD(i,n)的值

    枚举出n的所有因数,设为ai,时间复杂度为O(√n)

    GCD(i/ai,n/ai)=1,则转化为求n/ai的欧拉函数

    将求出的所有欧拉函数之和作为答案

    因为n<=2^31,所以O(n)求欧拉函数也不行

    用O(√n)的时间在线求出欧拉函数

     Φ=k*(1-1/p1)*(1-1/p2)....(1-1/pk)

    p为质因数

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 long long ans,n,m;
     8 long long phi(long long x)
     9 {int i;
    10     long long s=x;
    11     int l=sqrt(x);
    12     for (i=2;i<=l;i++)
    13     {
    14         if (x%i==0)
    15         {
    16             s=s/i*(i-1);
    17             while (x%i==0) x=x/i;
    18         }
    19     }
    20     if (x>1) s=s/x*(x-1);
    21     return s;
    22 }
    23 int main()
    24 {int i;
    25     cin>>n;
    26     m=sqrt(n);
    27      for (i=1;i<=m;i++)
    28      {
    29             if (n%i==0)
    30             {
    31               ans+=i*phi(n/i);
    32               if (i*i<n) ans+=(n/i)*phi(i);
    33             }
    34      }
    35  cout<<ans;    
    36 }
  • 相关阅读:
    LVM(逻辑卷管理器)部署、扩容、缩小
    部署磁盘阵列
    docker安装
    Linux基础命令
    awk补充
    awk
    shell脚本--grep与正则表达式
    文本处理工具 -wc、cut、sort、uniq的用法及参数
    Shell脚本编程原理
    重定向与管道符
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7138104.html
Copyright © 2011-2022 走看看