4658. 质因数个数、197. 阶乘分解、模板题【线性筛求积性函数】(数论练习题)

news2024/9/20 16:40:19

目录

4658. 质因数个数

题目描述

运行代码

代码思路

197. 阶乘分解

题目描述

运行代码

代码思路

其他代码

代码思路

模板题【线性筛求积性函数】

题目描述

​编辑

运行代码

代码思路

4658. 质因数个数

题目描述

4658. 质因数个数 - AcWing题库

运行代码

#include<iostream>
using namespace std;
typedef long long ll;
ll n;
int count(ll x) {
	int c = 0;
	for(ll i=2;i<=x/i;i++)
		if (x % i == 0) {
			while (x % i == 0)x /= i;
			c++;
		}
	if (x > 1)c++;
	return c;
}
int main() {
	cin >> n;
	cout << count(n);
	return 0;
}

代码思路

  1. 定义了一个函数 count ,用于计算给定整数 x 的不同质因数的个数。

    • 初始化一个计数器 c 为 0 。
    • 从 2 到 x 的平方根进行遍历。如果 x 能被当前的 i 整除,就通过一个内层循环不断用 x 除以 i ,去除该质因数的影响,并将计数器 c 加 1 。
    • 检查如果经过上述循环后 x 仍然大于 1,说明 x 本身是一个未被除尽的质因数,将计数器 c 加 1 。
    • 最后返回计数器 c ,即质因数的个数。
  2. 在 main 函数中:

    • 读入一个整数 n 。
    • 调用 count 函数计算 n 的不同质因数的个数,并将结果输出。

197. 阶乘分解

题目描述

197. 阶乘分解 - AcWing题库

运行代码

#include <iostream>
using namespace std;
const int N = 1000006;
int primes[N], cnt;
bool st[N];
void Primes(int n) {
    for (int i = 2; i <= n; i++) {
        if (!st[i]) {
            primes[cnt++] = i;
            for (int j = i; j <= n; j += i) {
                st[j] = true;
            }
        }
    }
}
int main() {
    int n;
    cin >> n;
    Primes(n);
    int c[N] = {0};
    for (int i = 0; i < cnt; i++) {
        int p = primes[i];
        int num = 0;
        for (int j = p; j <= n; j += p) {
            int x = j;
            while (x % p == 0) {
                num++;
                x /= p;
            }
        }
        c[i] = num;
    }
    for (int i = 0; i < cnt; i++) {
        if (c[i]) cout << primes[i] << " " << c[i] << endl;
    }
    return 0;
}

代码思路

  1. Primes 函数:

    • 从 2 到 n 遍历每个数 i 。
    • 如果 st[i] 为 false,说明 i 是一个未被标记的数,即可能是质数。
    • 将 i 存入 primes 数组,并增加 cnt 计数。
    • 然后通过一个循环,将 i 的倍数(从 i 本身开始,每次增加 i )都标记为合数(st[j] = true)。
  2. 在 main 函数中:

    • 读入一个整数 n ,调用 Primes(n) 函数来获取小于等于 n 的所有质数并存入 primes 数组。
    • 初始化一个数组 c[N] ,用于记录每个质数在 n! 中的出现次数。
    • 对于每个质数 primes[i] ,通过一个内层循环从该质数开始,每次增加该质数,检查每个能被该质数整除的数,计算其能被整除的次数,并将总次数累加到 num 中,最后将 num 存入 c[i] 。
    • 最后遍历 c 数组,输出每个出现次数不为 0 的质数及其在 n! 中的出现次数。

其他代码

#include <iostream>
using namespace std;

const int N = 1000006;
int primeNums[N], primeCnt = 0;
bool isComp[N * 2];
// 筛选质数的函数
void findPrimes(int n) {
    for (int i = 2; i <= n; i++) {
        if (isComp[i]) continue;
        for (int j = 2; j * i <= n; j++) {
            isComp[i * j] = true;
        }
    }
    for (int i = 2; i <= n; i++) {
        if (!isComp[i]) primeNums[++primeCnt] = i;
    }
}
int main() {
    int num;
    cin >> num;
    findPrimes(num);
    for (int i = 1; i <= primeCnt; i++) {
        int temp = num, curPrime = primeNums[i], cnt = 0;
        while (temp) {
            cnt += (temp / curPrime);
            temp /= curPrime;
        }
        cout << curPrime << " " << cnt << endl;
    }
    return 0;
}

代码思路

  1. findPrimes 函数:

    • 这个函数的目的是筛选出小于等于 n 的所有质数。
    • 首先外层循环从 2 到 n 遍历每个数 i 。
    • 如果 isComp[i] 为 true ,说明 i 已经被标记为合数,直接跳过。
    • 对于未标记为合数的 i ,通过内层循环将 i 的倍数(从 2 倍开始到小于等于 n )标记为合数(设置 isComp[i * j] = true )。
    • 再次遍历从 2 到 n ,将未被标记为合数的数存入 primeNums 数组,并通过 primeCnt 记录质数的个数。
  2. main 函数:

    • 读入一个整数 num 。
    • 调用 findPrimes(num) 函数获取小于等于 num 的所有质数。
    • 然后通过一个循环,对于每个找到的质数 primeNums[i] (从 1 开始到 primeCnt ):
      • 初始化 temp 为 num ,cnt 为 0 。
      • 通过一个内层循环,不断计算 temp 中有多少个 primeNums[i] ,每有一个就将 cnt 加 1 ,并更新 temp 为 temp / primeNums[i] 。
      • 最后输出当前的质数 primeNums[i] 和它在 num 中的出现次数 cnt 。

模板题【线性筛求积性函数】

题目描述

A-模板题【线性筛求积性函数】_牛客竞赛数学专题班积性函数(积性函数概念、欧拉筛求积性函数、莫比乌斯反演) (nowcoder.com)

运行代码

#include<iostream>
using namespace std;
typedef long long ll;
int q,n;
int main(){
    cin>>q;
    while(q--){
        cin>>n;
        ll ans=1;
        for(int i=2;i*i<=n;i++){
            int cnt=0;
            while(n%i==0){
                n/=i;
                cnt++;
            }
            ans*=(cnt+1);
        }
        if(n>1)
            ans*=2;
        cout<<ans<<endl;
    }
}

代码思路

  1. 首先,通过 cin >> q 读取测试用例的数量 q 。
  2. 然后,进入一个 while 循环,每次处理一个测试用例。
    • 读取当前测试用例中的整数 n 。
    • 初始化结果变量 ans 为 1 。
    • 通过一个 for 循环从 2 开始,直到 i * i <= n ,尝试找出能整除 n 的数 i 。
    • 对于每个能整除 n 的数 i ,使用一个内部的 while 循环计算 n 中包含 i 的个数 cnt ,同时不断更新 n 为 n / i 。
    • 将 ans 乘以 (cnt + 1) ,这是因为一个数的某个质因数 i 的指数为 cnt 时,该质因数对因数个数的贡献为 cnt + 1 。
    • 当循环结束后,如果 n 仍然大于 1 ,说明 n 本身是一个质数,将 ans 乘以 2 。
    • 最后输出 ans ,即 n 的因数个数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

银河麒麟V10 审计工具 auditd 内存泄漏问题

问题描述 银河麒麟V10 SP1 审计工具 auditd 引发的内存占用过高&#xff0c; 内存占用171G&#xff0c; 内存一直不释放 解决方案 重启进程 auditd 是银河麒麟的审计工具&#xff0c; 分析是由于 yum 源的特性&#xff0c; 造成审计工具占用内存不释放&#xff0c; 重启 a…

dsc集群添加磁盘空间

在达梦数据库dsc集群保姆级部署文档_达梦数据库文档-CSDN博客这篇文档的基础上操作添加磁盘&#xff0c;进行一个扩容操作。 在生产环境中&#xff0c;数据存储集群&#xff08;DSC&#xff09;的磁盘空间不足是一个常见问题&#xff0c;这可能会导致服务中断或性能下降。为了…

代码随想录算法训练营day35 | 0-1背包理论基础、416. 分割等和子集

碎碎念&#xff1a;加油&#xff01;&#xff01; 参考&#xff1a;代码随想录 0-1背包理论基础 几类背包的区别&#xff1a; 0-1背包的每种物品只有一个 完全背包的每种物品有无限个 多重背包的每种物品的个数各不相同 01背包&#xff1a; 有n件物品和一个最多能背重量为w …

如何开发属于你的智能人才招聘系统:源码解析

今天&#xff0c;小编将从源码解析的角度&#xff0c;带你深入了解如何开发属于你的智能人才招聘系统。 一、为什么选择开发自己的智能招聘系统&#xff1f; 市面上已有许多现成的招聘系统&#xff0c;但这些系统往往无法完全满足企业个性化的需求。通过开发自有系统&#xf…

中小型水库雨水情及大坝安全监测系统完整方案

一、背景 随着气候变化和极端天气事件的频发&#xff0c;中小型水库的安全运行显得愈发重要。为确保水库大坝的稳定性和防洪功能的发挥&#xff0c;建设一套完善的雨水情及大坝安全监测系统显得尤为重要。本文将从系统背景、系统介绍、应用实例和未来展望等方面&#xff0c;对…

【HTML入门】第二十三课 - 【实战】做一个简单的图书详情页

这一节&#xff0c;我们继续用纯HTML来做一个实战小案例。 我找了一个图书详情的页面&#xff0c;就像这样&#xff1a; 这一小节&#xff0c;我们用纯HTML标签&#xff0c;来实现一下这个图书详情的内容。 目录 1 布局分析 2 用到的标签 3 实战代码 1 布局分析 我们看这张…

SQL各种注入详解加案例--持续更新

sql注入 联合查询注入案例手工注入判断是否有SQL注入漏洞 sqlmap工具注入 报错注入常用的函数updatexml()函数案例 floor()涉及的函数实现手工注入sqlmap工具注入 盲注布尔盲注案例手工注入脚本sqlmap自动化工具 时间盲注 post注入GET传参和POST传参案例手工注入sqlmap工具 二次…

Venv复制可以减少Pip install

接前面的一篇博客《PyCharm找不到Python咋办》中遇到的步骤&#xff1a; 有上图的提示&#xff0c;说明需要将原来的venv进行清空。&#xff08;还可以用重命名的方式&#xff0c;这样venv当中的库可以保留&#xff0c;如果Python的版本和原来一样的话&#xff0c;直接覆盖回来…

10个日常开发必备的 JavaScript 代码片段

在 Web 开发领域&#xff0c;开发效率是关键。为什么每次开始新项目时都要重新发明轮子&#xff1f;今天&#xff0c;本文汇总整理了一些方便日常开发使用的 JavaScript 代码片段&#xff0c;超越了 Lodash 和 day.js 等常见代码片段&#xff0c;提升你的开发效率&#xff0c;减…

x264 中像素扩边算法源码分析

介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…

Mysql开启SSL

等二测出未开启SSL,如下 have_openssl、have_ssl都是DISABLED也不知道当时为啥没开&#xff0c;看最近的都是开启的,整改必去得开了&#xff0c;开启步骤 1.生成秘钥 进入mysql的bin目录下&#xff0c;运行 ./mysql_ssl_rsa_setup运行后会生成证书 默认证书会在mysql的data…

PTrade常见问题系列20

量化周末测试不打印日志&#xff0c;需要如何测试&#xff1f; 需要将量化服务器后台时间&#xff0c;和ptrade终端所在的电脑时间改到下周一或周五&#xff0c;具体测试方案如下&#xff1a; 先停止nginx&#xff0c;并且备份nfs以防恢复异常。 1.重置生产账号A的密码(若测试…

sed 简易使用指南

sed 简易使用指南 1 sed 介绍2 查找3 替换4 反向引用5 删除6 cai&#xff08;菜&#xff09; 导言&#xff1a; 笔者之前花了较多时间学习并整理了sed命令相关的内容&#xff0c;以及一些进阶内容。但是&#xff0c;到后来使用也就只记得那么几个简单的选项&#xff0c;再高级的…

程序员进阶之路:缓存、网络、内存与案例

编辑推荐 适读人群 &#xff1a;本书适合有一定开发经验的开发人员&#xff0c;想要突破初级层次&#xff0c;迈向高级开发的程序员阅读。 【与时俱进】本书基于Linux 6.0及以上版本讲解书中涉及的各个模块&#xff0c;有助于读者理解现代Linux内核&#xff0c;掌握实用的技术…

XML动态sql查询当前时间之前的信息报错

如图&#xff0c;sql语句在数据库里可以正常运行但是再XML文件不可以正常运行&#xff0c;报错。 原因&#xff1a;在XML中小于号"<"是会被默认认定成文一个标签的开始&#xff0c;所以用小于号就会报错。 解决办法&#xff1a; 1.把表达式反过来改成大于号 2…

新手教学系列——使用 Redis 实现任务队列:先进先出和后进先出的选择

在分布式系统和高并发场景下,任务队列是管理任务调度和执行的关键工具。Redis 作为一种高效的内存数据库,提供了简单且强大的数据结构,可以方便地实现任务队列。本文将深入探讨如何利用 Redis 实现先进先出(FIFO)和后进先出(LIFO)两种任务队列,并介绍其应用场景和实现方…

11153 kill boss

这个问题可以通过模拟游戏的过程来解决。我们可以遍历每一轮的出招&#xff0c;根据出招的规则来计算每一轮的伤害&#xff0c;并更新Acmer和Boss的血量。如果在某一轮结束后&#xff0c;Acmer的血量小于等于0&#xff0c;那么Boss赢&#xff1b;如果Boss的血量小于等于0&#…

总线学习3--SPI

一 环境搭建 老规矩&#xff0c;先上图吧。。 上面电源线接到VBUS了&#xff0c;给的一个5V&#xff0c;应该3.3V。不过这个屏还能正常跑也是不错。 折腾了一个晚上&#xff0c;主要还是找驱动&#xff0c;然后熟悉SPI接口的接法。 遇到了两个坑&#xff1a; 1 接口名称不统…

Python异常处理:12个异常处理技巧,你掌握了几个?

探索Python异常处理的深度策略&#xff0c;从基础的try-except结构到自定义异常类的创建&#xff0c;再到利用上下文管理器和装饰器提升代码健壮性。深入理解异常传递机制&#xff0c;掌握日志记录与并发环境下异常处理的关键实践&#xff0c;强调了性能考量与避免异常作为控制…

简单的docker学习 第3章 docker镜像

第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 ​ 镜像是一种轻量级、可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件等…