洛谷 P1403 约数研究

洛谷 P1403 约数研究

原题链接:P1403 约数研究 - 洛谷

数据增强:U264257 Multiple (Difficult) - 洛谷

前置知识

  1. a 能整除 b (或者说ba的因子)用符号表示为 ba

  2. 1n 中约数(即因子)含 x 的数的个数为 nx

  3. 数论分块 - Cattle_Horse

证明

对于 x 作为因子,x 一定为 x,2x3x4x...kx 的因子,则 k=nx

所以 answer=k=nx

解决该题

n=6 为例,即求 i=16f(i)

1 的约数:1
2 的约数:12
3 的约数:1, ,3
4 的约数:12, ,4
5 的约数:1, , , ,5
6 的约数:123, , ,6

正常思路:求每个数的约数个数,再求和,即横着看

换种思路:求 1n 中有多少个数约数含 i ,其中 i[1,n],即竖着看

证明:

i=1nf(i)=i=1ndi1

i=1nf(i)=i=1nd=1n(di)

i=1nf(i)=d=1ni=1n(di)

2i=1nf(i)=d=1nnd

Code(50)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            ans += n / i;
        }
        System.out.println(ans);
    }
}

Code(100)

数论分块 - Cattle_Horse

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        long ans = 0;
        for (long l = 1, r; l <= n; l = r + 1) {
            r = n / (n / l);
            ans += n / l * (r - l + 1);
        }
        System.out.println(ans);
    }
}
posted @   Cattle_Horse  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示