zoukankan      html  css  js  c++  java
  • 欧拉心算

    传送门

    解法:

    [egin{align} sum_{i=1}^nsum_{j=1}^nphi(gcd(i,j))&=sum_{d=1}phi(d)sum_{i=1}^nsum_{j=1}^n[d==gcd(i,j)]\ &=sum_{d=1}^nphi(d)sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{n}{d} floor}sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)[k|gcd(i,j)]\ &=sum_{T=1}^nlfloorfrac{n}{T} floor^2mu*phi(T)\ end{align} ]

    下面考虑转化这个式子

    [sum_{i=1}^nf*g(i)=sum_{i=1}^nf(i)sum_{j=1}^{lfloorfrac{n}{i} floor}g(j)\ egin{align} sum_{i=1}^nphi(i)sum_{j=1}^{lfloorfrac{n}{i} floor}phi(j)&=sum_{i=1}^nmu*phi(i)sum_{j=1}^{lfloorfrac{n}{i} floor}id(j)\ &=sum_{i=1}^nmu*phi(i)frac{lfloorfrac{n}{i} floor(lfloorfrac{n}{i} floor+1)}{2}\ &=frac{sum_{i=1}^nlfloorfrac{n}{i} floor^2mu*phi(i)+sum_{i=1}^nlfloorfrac{n}{i} floormu*phi(i)}{2}\ &=frac{sum_{i=1}^nlfloorfrac{n}{i} floor^2mu*phi(i)+sum_{i=1}^nphi(i)}{2}\ end{align}\ sum_{i=1}^nlfloorfrac{n}{i} floor^2mu*phi(i)=2 imessum_{i=1}^nphi(i)sum_{j=1}^{lfloorfrac{n}{i} floor}phi(j)-sum_{i=1}^nphi(i) ]

    代码:

    //https://www.lydsy.com/JudgeOnline/problem.php?id=4804
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<bitset>
    #include<set>
    #define rep(i,a,b) for(int i=(a);i<=(b);++i)
    #define dwn(i,a,b) for(int i=(a);i>=(b);--i)
    using namespace std;
    typedef long long ll;
    const int N=10000000;
    int T,n,cnt,prime[1000010];
    bool v[N+10];
    ll phi[N+10];
    inline void init(int n)
    {
        phi[1]=1;
        rep(i,2,n)
        {
            if(!v[i])
            {
                prime[++cnt]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=cnt&&prime[j]*i<=n;++j)
            {
                v[prime[j]*i]=1;
                if(i%prime[j]==0)
                {
                    phi[prime[j]*i]=phi[i]*prime[j];
                    break;
                }
                phi[prime[j]*i]=phi[i]*(prime[j]-1);
            }
        }
        rep(i,2,n)
        {
            phi[i]+=phi[i-1];
        }
    }
    int main()
    {
        init(N);
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            ll ans=0;
            for(int l=1,r;l<=n;l=r+1)
            {
                r=n/(n/l);
                ans+=phi[n/l]*(phi[r]-phi[l-1]);
            }
            printf("%lld
    ",2*ans-phi[n]);
        }
        return 0;
    }
    
  • 相关阅读:
    springboot实现redis的分布式锁
    剑指offer--二维数组中查找
    剑指offer--二维数组中查找
    对JDK动态代理的模拟实现
    Spring(4)AOP
    设计模式之单例模式(Java)
    【Java并发系列】--Java内存模型
    maven 解决jar包冲突及简单使用
    基于注解的SpringAOP源码解析(三)
    Java代码中可以优化性能的小细节
  • 原文地址:https://www.cnblogs.com/MYsBlogs/p/11440159.html
Copyright © 2011-2022 走看看