zoukankan      html  css  js  c++  java
  • bzoj2705

    答案就是 ∑ d * phi(n / d) (d | n) 。。没得说。。

     1 #include<bits/stdc++.h>
     2 #define clr(a,x) memset(a,x,sizeof(a))
     3 #define rep(i,l,r) for(int i=l;i<r;i++)
     4 typedef long long ll;
     5 using namespace std;
     6 ll read()
     7 {
     8     char c=getchar();
     9     ll ans=0,f=1;
    10     while(!isdigit(c)){
    11         if(c=='-') f=-1;
    12         c=getchar();
    13     }
    14     while(isdigit(c)){
    15         ans=ans*10+c-'0';
    16         c=getchar();
    17     }
    18     return ans*f;
    19 }
    20 const int maxm=70000;
    21 int f[maxm];
    22 ll phi(ll x)
    23 {
    24     ll ans=x,m=ll(sqrt(x));
    25     for(ll i=2;i<=m;i++)
    26         if(x%i==0)
    27         {
    28             ans=ans/i*(i-1);
    29             while(x%i==0)x/=i;
    30         }
    31     if(x>1) ans=ans/x*(x-1);
    32     return ans;
    33 }
    34 int main()
    35 {    
    36     ll n=read(),ans=0;
    37     int m=int(sqrt(n));
    38     rep(i,1,m+1){
    39         if(n%i==0){
    40             ans+=i*phi(n/i);
    41             if(i*i<=n) ans+=(n/i)*phi(i);
    42         }
    43     }
    44     printf("%lld
    ",ans);
    45     return 0;
    46 }
    View Code

    还有orzlsj的方法:

    注意到h(n) = ∑ d * phi(n / d) (d | n) 是狄利克雷卷积的形式, 而且f(x) = x 和 f(x) = phi(x) 都是积性函数, 所以答案h(x) 也是积性函数.

    所以h(x) = Π h(p^k) (p 是 x 的质因数) 

    由phi(p^k) = p^k - p^(k-1), h(p^k) 很好求. 化简一下得到 h(p^k) = (k + 1) * p^k - k * p^(k - 1) 

     1 #include<bits/stdc++.h>
     2 #define clr(a,x) memset(a,x,sizeof(a))
     3 #define rep(i,l,r) for(int i=l;i<r;i++)
     4 typedef long long ll;
     5 using namespace std;
     6 ll read()
     7 {
     8     char c=getchar();
     9     ll ans=0,f=1;
    10     while(!isdigit(c)){
    11         if(c=='-') f=-1;
    12         c=getchar();
    13     }
    14     while(isdigit(c)){
    15         ans=ans*10+c-'0';
    16         c=getchar();
    17     }
    18     return ans*f;
    19 }
    20 const int maxm=70000;
    21 int f[maxm];
    22 ll phi(ll x)
    23 {
    24     ll ans=x,m=ll(sqrt(x));
    25     for(ll i=2;i<=m;i++)
    26         if(x%i==0)
    27         {
    28             ans=ans/i*(i-1);
    29             while(x%i==0)x/=i;
    30         }
    31     if(x>1) ans=ans/x*(x-1);
    32     return ans;
    33 }
    34 int main()
    35 {    
    36     ll n=read(),ans=1;
    37     int m=int(sqrt(n));
    38     rep(i,2,m+1){
    39         if(n%i==0){
    40             int k=0;
    41             while(n%i==0){
    42                 k++;n/=i;
    43             }
    44             ans*=(k+1)*pow(i,k)-k*pow(i,k-1);
    45         }
    46     }
    47     if(n!=1) ans*=2*n-1;
    48     printf("%lld
    ",ans);
    49     return 0;
    50 }
    View Code

    2705: [SDOI2012]Longge的问题

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 1514  Solved: 943
    [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

    [Submit][Status][Discuss]
  • 相关阅读:
    20165208 2017-2018-2 《Java程序设计》第三周学习总结
    20165208 预备作业3 Linux安装及学习
    20155315 2016-2017-2《Java程序设计》课程总结
    20155315 2016-2017-2 《Java程序设计》第十周学习总结
    20155315 2016-2017-2 《Java程序设计》第九周学习总结
    20155315 2016-2017-2 《Java程序设计》第八周学习总结
    20155315 2016-2017-2 《Java程序设计》第七周学习总结
    2017-2018-2 20165330 实验四《Android程序设计》实验报告
    第十周课堂实践总结
    2017-2018-2 20165330 实验三《敏捷开发与XP实现》实验报告
  • 原文地址:https://www.cnblogs.com/chensiang/p/4685730.html
Copyright © 2011-2022 走看看