zoukankan      html  css  js  c++  java
  • 洛谷P2398 GCD SUM (数学)

    洛谷P2398 GCD SUM

    题目描述

    for i=1 to n

    for j=1 to n

     sum+=gcd(i,j)
    

    给出n求sum. gcd(x,y)表示x,y的最大公约数.

    输入输出格式

    输入格式:

    n

    输出格式:

    sum

    输入输出样例

    输入样例#1:

    2

    输出样例#1:

    5

    说明

    数据范围 30% n<=3000 60% 7000<=n<=7100 100% n<=100000

    Solution

    这道题的做法貌似很多...如果你同时会狄利克雷卷积和莫比乌斯反演的话也可以强行反演一波,反正蒟蒻我是不会卷的,所以在这里介绍另外一种做法

    一个式子描述题意(ans=sum _{i=1}^{n}sum_{j=1}^{n}gcd(i,j))

    直接暴力肯定是不行的,我们想一下有没有办法求出一个数它作为(gcd)的贡献呢?

    对于两个数(gcd(a,b)=1 o gcd(ka,kb)=k(ka<=n,kb<=n)),所以k作为(gcd)的贡献就是(gcd(x,y)=k)的数对的对数,还不准确,因为数对((x,y),(y,x)),分别对答案都有贡献,但x=y的情况只能算一次,所以是 数对的个数*2-1,那么关键就在于怎么快速算出这个对数

    我们发现(n)以内(gcd)(k)的对数,实际上就是(lfloorfrac{n}{k} floor)以内gcd为1的数对的对数,这其实就是(lfloorfrac{n}{k} floor)以内每个数的欧拉函数的值之和,即(2 imes sum_{i=1}^{lfloorfrac{n}{k} floor}phi(i)-1),这个对数*数值就是每个数的贡献

    线性筛一遍欧拉函数求前缀和就可以了....

    Code

    #include<bits/stdc++.h>
    #define in(i) (i=read())
    #define il extern inline
    #define rg register
    #define mid ((l+r)>>1)
    #define Min(a,b) ((a)<(b)?(a):(b))
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define lol long long
    using namespace std;
    
    const lol N=1e5+10;
    
    lol read() {
        lol ans=0, f=1; char i=getchar();
        while (i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
        while (i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+(i^48), i=getchar();
        return ans*f;
    }
    
    lol n,ans,cnt,vis[N],prime[N],phi[N]={0,1};
    
    void init() {
        for (lol i=2;i<=N-10;i++) {
            if (!vis[i]) prime[++cnt]=i,phi[i]=i-1;
            for (lol j=1;j<=cnt && prime[j]*i<=N-10;j++) {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0) {phi[i*prime[j]]=phi[i]*prime[j]; break;}
                else phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }for (lol i=1;i<=N-10;i++) phi[i]+=phi[i-1];
    }
    
    int main()
    {
        in(n); init();
        for (lol i=1;i<=n;i++) ans+=(2*phi[n/i]-1)*i;
        cout<<ans<<endl;
    }
    
    
  • 相关阅读:
    AWS API Gateway Swagger定义
    linux常用命令---终端与目录操作
    虚拟机安装配置(VMware与CentOS安装)
    机器学习必会工具gensim
    汉语分词工具包jieba
    汉语拼音转换工具包pypinyin
    第一章 Python 基础
    removebg抠图小工具
    Django数据库表初始化缓存清除
    自定义分页(类封装高级版+函数低级版)
  • 原文地址:https://www.cnblogs.com/real-l/p/9892965.html
Copyright © 2011-2022 走看看