zoukankan      html  css  js  c++  java
  • P2398 GCD SUM

    P2398 GCD SUM
    一开始是憨打表,后来发现打多了,超过代码长度了。缩小之后是30分,和暴力一样。正解是,用f[k]表示gcd为k的一共有多少对。ans=sigma k(1->n) k*
    f[k].g[k]表示f[k]+f[2*k]+...+f[(n/k)*k];
    so f[k]=g[k]-(f[2*k]+...+f[(n/k)*k])
    g[k]=(n/k)*(n/k)
    比如g[5] (5,5,10,15..20)
    复杂度是调和级数 nlnn

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #include<ctime>
    #include<cstring>
    #define inf 2147483647
    #define For(i,a,b) for(register long long i=a;i<=b;i++)
    #define p(a) putchar(a)
    #define g() getchar()
    
    using namespace std;
    long long n;
    long long f[100010];
    long long ans;
    void in(long long &x)
    {
    
        char c=g();x=0;
        while(c<'0'||c>'9')c=g();
        while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
    }
    
    void o(long long x)
    {
        if(x>9)o(x/10);
        p(x%10+'0');
    }
    
    
    int main()
    {
        cin>>n;
        for(long long k=n;k>=1;k--)
        {
            long long sum=0;
            For(i,2,n)
            {
                if(i*k<=n)
                sum+=f[i*k];
                else
                break;
            }
            f[k]=(n/k)*(n/k)-sum;
        }
        for(long long k=n;k>=1;k--)
        {
            ans+=k*f[k];
        }
        o(ans);
         return 0;
    }
  • 相关阅读:
    gems gems gems
    poj 6206 Apple
    lightoj1341唯一分解定理
    lightoj1370欧拉函数
    约瑟夫环lightoj1179
    拓展欧几里得算法
    RMQ算法
    poj1502MPI Maelstrom
    poj1860Currency Exchange
    生成全排列
  • 原文地址:https://www.cnblogs.com/war1111/p/7641546.html
Copyright © 2011-2022 走看看