人生第一道自己做出来的数论题qwq..纪念一下

一开始复杂度不确定,和syq大兄弟讨论了一下才敢写

 

化简一下,枚举gcd然后计算其出现次数,发现g出现的次数就是phi(n/g),所以求的就是sigma(g*phi(n/g)*[g|n])

感觉这样搞是O(sqrt(n)*sqrt(n))=O(n)的,然而,一个数的质因数数量级在ln(n),因此是O(sqrt(n)ln(n))的,飞快。

 

#include<iostream>
#include<cstdio>

using namespace std;

typedef long long ll;

int phi(int x){
    int ret=x;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            ret=ret/i*(i-1);
            while(x%i==0) x/=i;
        }
    }
    if(x!=1) ret=ret/x*(x-1);
    return ret;
}

int n;

int main(){
    cin>>n;
    long long ans=0;
    for(int i=1;i*i<=n;i++){
        if(n%i) continue;
        ans+=1ll*i*phi(n/i)+1ll*(n/i)*phi(i);
    }
    cout<<ans;
    return 0;
}

 

相关文章:

  • 2021-06-20
  • 2022-12-23
  • 2021-12-23
  • 2021-12-08
  • 2021-12-03
  • 2021-10-11
  • 2021-12-20
  • 2022-01-11
猜你喜欢
  • 2022-01-25
  • 2021-09-04
  • 2021-08-06
  • 2021-12-02
  • 2021-09-22
  • 2021-09-22
相关资源
相似解决方案