首页 > 编程语言 >(log求因数和)北京建筑大学2024年程序设计竞赛 B因数之和

(log求因数和)北京建筑大学2024年程序设计竞赛 B因数之和

时间:2024-06-30 19:09:55浏览次数:1  
标签:i64 log int res 2024 因数 using 质因数

题意:

计算一个数的所有因数的和通常涉及质因数分解,然后对每个质因数的幂次进行求和运算。
具体步骤如下:
1.质因数分解:首先,将给定的数进行质因数分解,表示为\(2^{a}*3^{b}*5^{c}....\)
2.计算每个质因数的贡献:对于每个质因数p(如2, 3, 5等),计算从p{0}到p的所有数的和
3.这可以通过等比数列求和公式完成,即$p{a}+p*p{a-2}+....+p+p{0}=\frac{p-1}{p-1} $
4.乘积运算:将所有质因数的贡献相乘,即(2{a}+2+2{a-2}+...+2+2{0})*(3+3{b-1}+3+...+3{1}+3)....

思路:
知道了求因数和的方法后,我们显然要对每个数进行一次分解质因数,但是一看数据范围1e6,而正常分解质因数复杂度是\(\sqrt{n}\),显然超时。
我们考虑先用线性筛预处理出来所有的质数,这样复杂度会降低到log级别。再用因数求和公式计算和,然后统计答案即可。

code:

#include <bits/stdc++.h>
#include<bits/extc++.h>
using namespace __gnu_pbds;
using namespace std;
using i64 = long long;
using u64 = unsigned long long;
using PII = pair<i64, i64>;
const int inf = 0x3f3f3f3f;
const i64 INF = 0x3f3f3f3f3f3f3f3f;
#define Z cout << "\n"
#define lb lower_bound
#define ub upper_bound
#define D(x) cerr << #x << ": " << (x) << "\n"
#define DV(v) cerr<<#v<<": ";for(int i=0;i<(v).size();i++)cerr<<((v)[i])<<",";cerr<<"\n"
#if 0
#define int i64
#endif
const int N = 1e6 + 5;
int p[N], pr[N], tot;
void prim(int n) {
    for (int i = 2; i <= n; i++) {
        if (!p[i])p[i] = i, pr[++tot] = i;
        for (int j = 1; j <= tot && pr[j] * i <= n; j++) {
            p[i * pr[j]] = pr[j];
            if (i % pr[j] == 0) {
                break;
            }
        }
    }
}
map<int, int>mp;
void divide(int x) {
    while (p[x] > 1)mp[p[x]]++, x /= p[x];
    if (x > 1)mp[x]++;
}
const int P = 1e9 + 7;
i64 quick(i64 a, i64 n) {
    int res = 1;
    while (n) {
        if (n & 1) res = res * a % P;
        a = a * a % P;
        n >>= 1;
    }
    return res;
}
int inv(int x) {
    return quick(x, P - 2);
}
int s[N];
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    prim(1e6 + 1);
    for (int i = 1; i <= 1e6; i++) {
        divide(i);
        i64 z = 1;
        for (auto [p, n] : mp) {
            z *= (quick(p, n + 1) - 1) * inv(p - 1) % P;
        }
        if (z >= 2 * i)s[i] = 1;
        mp.clear();
    }
    for (int i = 1; i <= 1e6; i++)s[i] += s[i - 1];
    int m;
    cin >> m;
    while (m--) {
        int x, y;
        cin >> x >> y;
        cout << s[y] - s[x - 1] << "\n";
    }
    return 0;
}

标签:i64,log,int,res,2024,因数,using,质因数
From: https://www.cnblogs.com/iscr/p/18276812

相关文章

  • Arturia - FX Collection 5 v5.0.0 VST, VST3, AAX x64 {R2R} [13.06.2024]
    Arturia-FXCollection5v5.0.0forWindowsmac【【新品发布+小广告】ArturiaFXCollection5超强音乐制作插件套装34款产品逐一点评】https://www.bilibili.com/video/B...4d4e7f5c56f93e901cd    包括BusEXCITER-104BusFORCEBusPEAKChorusDIMENSION-DCh......
  • 第三次Blog
    (1) 前言:第七次大作业与第八次大作业知识点要是继承与多态并且对类方法的运用,题量比较大,难度也是不断上升。第七次大作业在第六次大作业基础上增加了受控窗帘这一受控设备与互斥开关这一控制开关,并考虑了一条总电路上有多个并联电路,输入信息也变得与第六次大作业不一样,但输出信息大......
  • 333 Login Endpoint
    步骤1、LoginDTO.csCitiesManager.Core/DTO文件夹下新建LoginDTO.csusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel.DataAnnotations;namespaceCitiesManager.Core.DTO{publicclassLoginDTO{[Required(ErrorMessage......
  • 334 Login UI
    步骤1、login-user.ts运行如下命令ng g class models\LoginUser生成的login-user.ts更新后显示如下exportclassLoginUser{email:string|null=null;password:string|null=null;}2、account.service.tsimport{HttpClient,HttpHeaders}from'......
  • 这个大纲涵盖了从基础到高级的 Log Parser 使用技巧和实践,帮助用户全面掌握这一强大的
    LogParser是一个功能强大的工具,用于处理和分析各种日志文件和数据源。以下是一个初级使用教程的大纲,帮助你快速入门和理解其基本功能和用法:1. 介绍和安装什么是LogParser?LogParser是一种强大的命令行工具,用于从多种日志文件、事件日志、CSV文件以及其他结构化数据......
  • 23201115-邓俊豪-第三次blog
    目录blog2前言关于难度和题目量关于知识点设计与分析pta-7一、项目简介二、项目实现三、项目测试四、代码示例五、总结六、代码分析pta-8一、项目简介二、项目实现三、项目测试四、代码示例五、总结六、代码分析改进建议blog2前言关于难度和题目量前三次大作业难度属于偏难水......
  • FireFox 编译指南2024 Windows10篇-环境准备(一)
    1.引言在开源浏览器项目中,Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox,开发者需要做好充分的环境准备工作。这不仅是编译成功的基础,也是后续调试、优化和二次开发的关键步骤。编译Firefox是一个复杂而耗时的过程,涉及大量的代码文件和依赖......
  • PTA题目集7~8的总结性Blog
    前言:对于我这种水平的学生来说本次的7-8次PTA的难度之大令我无从下手,况且之前的第6次PTA就已经让我望而止步了,更别提这两次在第6次PTA题目集之上再次进行迭代的题目了。再加上面临的期末周,大量学科等着我去复习,以至于没时间去钻磨PTA的改动,哭死,连老师都说单单是第8次题目集的题目......
  • 第三次blog
    一:前言这是最后一次大作业了,本次大作业让我感觉到难度很大,同时让我也学会了不少东西。学会了如何采用面对对象程序设计,更好的满足对象的需求,使得代码的功能性更强,同时使代码更加严谨,有效。智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音......
  • verilog写12 小时时钟(带上午/下午指示器)计数器(HDLbits Count clock)
    Createasetofcounterssuitableforuseasa12-hourclock(witham/pmindicator).Yourcountersareclockedbyafast-running clk,withapulseon ena wheneveryourclockshouldincrement(i.e.,oncepersecond).reset resetstheclockto12:00AM.......