• Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论


    2705: [SDOI2012]Longge的问题

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 1959  Solved: 1229
    [Submit][Status][Discuss]

    Description

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

    Input

    一个整数,为N。

    Output

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

    Sample Input

    6

    Sample Output

    15

    HINT

    【数据范围】

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

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

     

    Source

    round1 day1

    题解:

    直接欧拉函数即可。。。(注意:不要用线性筛,要用时再算欧拉函数。。。)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 LL lys,ys[2010],n;
     5 void getys()
     6 {
     7     LL nn=(LL)sqrt(n),i;
     8     lys=0;
     9     for(i=1;i<=nn;i++)
    10     {
    11         if(n%i==0)
    12         {
    13             ys[++lys]=i;
    14             if(i*i!=n)ys[++lys]=n/i;
    15         }
    16     }
    17 }
    18 LL phi(LL k)
    19 {
    20     LL kk=(LL)sqrt(k),k1=k,i;
    21     for(i=2;i<=kk;i++)
    22     {
    23         if(k1%i==0)
    24         {
    25             k=(k/i)*(i-1);
    26             while(k1%i==0)k1/=i;
    27         }
    28     }
    29     if(k1!=1)k=(k/k1)*(k1-1);
    30     return k;
    31 }
    32 int main()
    33 {
    34     LL k,i;
    35     LL ans;
    36     scanf("%lld",&n);
    37     getys();
    38     ans=0;
    39     for(i=1;i<=lys;i++)
    40     {
    41         if(n%ys[i]==0)
    42         {
    43             k=n/ys[i];
    44             ans+=(LL)phi(k)*ys[i];
    45         }
    46     }
    47     printf("%lld",ans);
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    Sum of a Function(区间筛)
    (01背包)输出方案数
    删边求概率
    完全背包输出方案数(dp)
    二分
    Just Arrange the Icons(模拟)
    Balls of Buma(回文串)
    dp思想
    刷题-力扣-190. 颠倒二进制位
    刷题-力扣-173. 二叉搜索树迭代器
  • 原文地址:https://www.cnblogs.com/Var123/p/5285912.html
Copyright © 2020-2023  润新知