zoukankan      html  css  js  c++  java
  • bzoj2705Longge的问题

    题目链接

    题意很简单

    $$ans=sum_{i=1}^{n}gcd(i,n)$$

    然后推一下式子,求一下欧拉函数就好了

    细节是由于$BZOJ$的评测计时策略,

    不能线性筛啊$……$

    必须每个数单独筛

    一开始线性筛洛谷上过了,$BZ$果断$T$

    /**************************************************************
        Problem: 2705
        User: zhangheran
        Language: C++
        Result: Accepted
        Time:28 ms
        Memory:89184 kb
    ****************************************************************/
     
    #pragma GCC optimize (2)
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int cnt;
    int prime[10000010];
    int phi[10000010];
    bool ins[10000010];
    void Euler()
    {
        phi[1]=1;
        for(int i=2;i<=10000000;i++){
          if(!ins[i]) prime[++cnt]=i,phi[i]=i-1;
          for(int j=1;j<=cnt&&i*prime[j]<=10000000;j++){
            ins[i*prime[j]]=true;
            if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}
            else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
        return ;
    }
    long long getphi(long long n)
    {
    //  if(n<10000000) return phi[n];
        long long res=n;
        for(long long i=2;i*i<=n;i++){
            if(n%i==0) res=res/i*(i-1);
            while(n%i==0) n/=i;
        }
        if(n>1) res=res/n*(n-1);
        return res;
    }
    long long x;
    long long ans;
    int main()
    {
    //  freopen("1.in","r",stdin);
    //  freopen("1.out","w",stdout);
        scanf("%lld",&x);
    //  Euler();
        long long i=1;
        for(;i*i<x;i++) if(x%i==0) ans+=i*getphi(x/i)+(x/i)*getphi(i);
        if(i*i==x) ans+=i*getphi(i);
        printf("%lld",ans);
    }
    //9812
  • 相关阅读:
    github免费私有仓库使用
    空间域平滑滤波器
    Matlab常用函数
    图像处理之图像的平滑与锐化
    Matlab实现直方图均衡化
    matlab图像灰度调整——imadjust函数的使用
    调整图像大小调整图片大小
    Matlab 图像平移、旋转、缩放、镜像
    Matlab注释的几个方法
    训练一个神经网络 能让她认得我
  • 原文地址:https://www.cnblogs.com/arcturus/p/9374883.html
Copyright © 2011-2022 走看看