zoukankan      html  css  js  c++  java
  • 题解 P1403 【[AHOI2005]约数研究】

    题目

    看到题解区很多人直接给出结论:答案为 \(\displaystyle \sum_{i=1}^n\lfloor{n\over i}\rfloor\) ,没给出证明,这里给出证明


    【分析】

    首先,我们可以知道 \(\displaystyle f(n)=\sum_{d\mid n}1\)

    有的同学看不懂这个公式,我解释一下,这个公式表达:

    枚举 \(n\) 的因数 \(d\),每枚举一个因数 \(d\)\(f(n)\)\(1\)

    \(d\mid n\)\(d\)\(n\) 的因数

    这样一来,我们就可以和题目的对应上了: \(f(n)\) 代表 \(n\) 的因数个数


    \(\displaystyle f(n)=\sum_{d\mid n}1\) 还有一种表达方式是 \(\displaystyle f(n)=\sum_{d=1}^n[d\mid n]\)

    后面那个鬼东西 \([d\mid n]\) 是一个判断正误的函数,正确为 \(1\) ,错误为 \(0\)

    这个应该理解起来也不难:

    枚举每一个数 \(d\) ,当 \(d\)\(n\) 的因数时, \(f(n)\)\(1\)


    题目要求的 \(\displaystyle M=\sum_{i=1}^n f(i)\)

    我们代入上面的定义式:

    \(\quad \displaystyle M\)

    \(\displaystyle=\sum_{i=1}^n\sum_{d\mid i}1\)

    \(\displaystyle=\sum_{i=1}^n\sum_{d=1}^i[d\mid i]\)

    我们调换一下枚举的顺序,把 \(d\) 的枚举提前。

    相当于考虑 \(d=1\) 时,对 \(i=1,2,3\dots n\) 的贡献; \(d=2\) 时对 \(i=1,2,3\dots n\) 的贡献; \(\dots\)\(d=n\) 时对 \(i=1,2,3\dots n\) 的贡献

    \(\displaystyle=\sum_{d=1}^n\sum_{i=1}^n[d\mid i]\)

    对于一个固定的 \(d\)\(\displaystyle\sum_{i=1}^n[d\mid i]\) 的意义非常直观:

    \(1\)~\(n\) 中,有多少个数以 \(d\) 为因数,即多少个数是 \(d\) 的倍数

    应该是 \(\lfloor{n\over d}\rfloor\)

    所以我们得到 \(\displaystyle M=\sum_{d=1}^n\lfloor{n\over d}\rfloor\)


    【代码】

    那本蒟蒻就放 我码风极丑的 代码了:

    C++ 版:

    #include<iostream>
    using namespace std;
    int main(){
        int n,ans=0;
        cin>>n;
        for(int i=1;i<=n;i++) ans+=n/i;
        cout<<ans;
    }
    

    Python 3 版:

    ans=0
    n=int(input())
    for i in range(1,n+1):
        ans+=n//i
    print(ans)
    
    

    最后安利一下本蒟蒻的博客

  • 相关阅读:
    Zookeeper Acl权限 超级用户权限 怎么跳过ACL密码/账户验证
    白名单与黑名单
    通过mstsc复制粘贴失败需要重新启动RDP剪切板监视程序rdpclip.exe
    go命令帮助
    go build 与go install
    1.Python编程基础
    使用 JMeter 进行压力测试
    js控制手机保持亮屏的库,解决h5移动端,自动息屏问题
    Linux安装配置redis 、启动redis、redis设置密码
    Linux安装部署FTP服务器
  • 原文地址:https://www.cnblogs.com/JustinRochester/p/12290695.html
Copyright © 2011-2022 走看看