罗勇军 →《算法竞赛·快冲300题》每日一题:“质因子数量” ← 快速幂、素数筛

【题目来源】
http://oj.ecustacm.cn/problem.php?id=1780
http://oj.ecustacm.cn/viewnews.php?id=1023

【题目描述】
给出n个数字,你可以任意选择一些数字相乘,相乘之后得到新数字x。
其中,
x的分数等于x不同质因子的数量
请你计算所有选择数字方案中,x分数的总和。答案对
1000000007取模。

【输入格式】
输入第一行为一个正整数n。
第二行包含n个正整数ai。(1≤n≤200000,1≤ai≤1000000)

【输出格式】
输出一个整数表示答案。即
输出所有的质数在所有组合中出现的总次数

【输入样例】
3
6 1 2

【输出样例】
10


【算法分析】
** 样例解析
针对本题中给出的包含 3 个数字的样例 {6, 1, 2},共有 8 种组合:∅, {1},{2},{6},{1,2},{1,6},{2,6},{1,2,6}。每种组合内数字相乘得 {∅, 1, 2, 6, 1×2, 1×6, 2×6, 1×2×6}={∅, 1, 2, 2×3, 2, 2×3, 2×2×3, 2×2×3},它们的质因子数量是 {0, 0, 1, 2, 1, 2, 2, 2},总和是10。∅ 表示空集。
也就是说,
从n个数中任选数字相乘,共有 2^n 种组合。由于本例中的 n 很大,所以直接调用pow() 库函数不可行,因为 pow() 不支持n超大的计算。另外,用位运算 2<<n 计算也不可取。所以,需要采用快速幂来计算 2^n。

** 快速幂(https://blog.csdn.net/hnjzsyjyj/article/details/132344391
快速幂就是快速计算底数a的n次幂,其时间复杂度为O(log₂n)。
与朴素幂运算的时间复杂度O(n)相比,快速幂的计算效率有了极大的提高。
矩阵快速幂的思想和快速幂的思想是一样的。无非就是底数变为矩阵了。所以,在计算矩阵快速幂时,只需在代码中定义一下矩阵的乘法即可。
利用
位运算实现快速幂,原理如下:
                     a^{11}=a^{1011_{(2)}}=a^{2^3+2^1+2^0}=a^{8+2+1}=a^8\times a^2\times a^1
将十进制幂转换为二进制幂,然后利用二进制位间的倍增关系递推,达到快速计算幂的过程
计算过程中,为了防止溢出,需要进行“
取模运算,其运算规则如下:
(a+b)%p=(a%p+b%p)%p
(a-b)%p=(a%p-b%p)%p

(a*b)%p=(a%p*b%p)%p
利用快速幂计算 a^n 的代码模板如下:

const int MOD=1e9+7;
typedef long long ll;
ll fastpow(ll a,ll n) {
    ll ans=1;
    while(n) {
        if(n&1) ans=ans*a%MOD;
        a=a*a%MOD;
        n>>=1;
    }
    return ans;
}

** 一个质数可能在多少个组合中出现?
一个质数在一个组合中出现一次,答案加1。统计所有的质数在所有组合中出现的总次数,就是本题所求答案。一个质数可能在多少个组合中出现?设 x 是其中 k 个数的因子,那么它将在 2^n−2^(n−k) 个组合中出现。
例如,在样例 {6,1,2} 中,质数2是 {6,2} 这2个数的因子,那么质数 2 将在 2^n−2^(n−k)=2^3-2^(3-2)=2^3-2^1=6 个组合中出现,即 {2,6,1×2,1×6,2×6,1×2×6}={2,2×3,2,2×3,2×2×3,2×2×3}。
又如,在样例 {6,1,2} 中,质数 3 是 {6} 的因子,那么质数 3 将在 2^n−2^(n−k)=2^3-2^(3-1)=2^3-2^2=4 个组合中出现,即 {6,1×6,2×6,1×2×6}={2,2×3,2×2×3,2×2×3} 。
答案是 6+4=10。


** 素数筛 <-- 欧拉筛(https://blog.csdn.net/hnjzsyjyj/article/details/132352060
普通的素数筛法,即将给定的数 n 以内的所有数 x 的倍数 kx(k≥2) 都筛掉。
显然由下图可知,同一个数可能被多个素数重复筛掉。如下图中的 6、12 被重复筛掉。
这需要优化,欧拉筛便是一种素数的线性筛法。原理是让每个合数只被它的最小质因数筛掉,这样每个合数只会被筛选一次。



本题的解题步骤是:
* 用素数筛得到所有的质数(本例代码用的是普通筛法,未用欧拉筛);
* 统计每个质数在 n 个数中出现的次数 k;
* 用 2^n-2^(n-k) 计算它在所有组合中的分数。


【算法代码】

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e6+5;
int cnt[maxn];
bool st[maxn];

typedef long long ll;
const int MOD=1e9+7;
ll fastpow(ll a, ll n) {
    ll ans=1;
    while(n) {
        if(n&1) ans=ans*a%MOD;
        a=a*a%MOD;
        n>>=1;
    }
    return ans;
}

int main() {
    int n;
    cin>>n;
    for(int i=1; i<=n; i++) {
        int a;
        scanf("%d",&a);
        cnt[a]++;
    }

    ll ans=0;
    for(int i=2; i<maxn; i++) {
        if(!st[i]) {
            ll k=cnt[i];
            for(int j=2*i; j<maxn; j+=i) {
                k+=cnt[j];
                st[j]=true;
            }
            if(k) {
                ans=(ans+fastpow(2,n)-fastpow(2,n-k)+MOD)%MOD;
            }
        }
    }
    cout<<ans<<endl;

    return 0;
}

/*
in:
3
6 1 2

out:
10
*/



【参考文献】
https://blog.csdn.net/weixin_43914593/article/details/131750902
https://blog.csdn.net/hnjzsyjyj/article/details/109556276

https://blog.csdn.net/qaqwqaqwq/article/details/123587336
https://zhuanlan.zhihu.com/p/494328631

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust】Rust学习 第十四章进一步认识 Cargo 和 Crates.io

本章会讨论 Cargo 其他一些更为高级的功能&#xff0c;我们将展示如何&#xff1a; 使用发布配置来自定义构建将库发布到 crates.io使用工作空间来组织更大的项目从 crates.io 安装二进制文件使用自定义的命令来扩展 Cargo Cargo 的功能不止本章所介绍的&#xff0c;关于其全…

蓝蓝设计-ui设计公司-界面设计案例作品

泛亚高科-光伏电站控制系统界面设计 html前端 | 交互设计 | 视觉设计 | 图标设计 泛亚高科(北京)科技有限公司&#xff08;以下简称“泛亚高科”&#xff09;&#xff0c;一个以实时监控、高精度数值计算为基础的科技公司&#xff0c; 自成立以来&#xff0c;组成了以博士、硕…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 1.动态获取地域数据以及数据中的平均值&#xff0c;按照平均值降序排序&#xff1b; 说明&#xff1a; X轴是动态的&#xff0c;有对应区域数据则展示&#xff1b; X轴 区域数据降序排序&#xff1b;…

Android Studio实现解析HTML获取图片URL,将URL存到list,进行瀑布流展示

目录 效果展示build.gradle(app)添加的依赖(用不上的可以不加)AndroidManifest.xml错误代码activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL效果展示 build.gradle(app)添加的依赖(用不上的可以不加) dependencies {implementation co…

Matlab 在一张图中画多个机械臂

在matlab中第一次画机械臂时&#xff0c;可能会出现的问题是Link函数不识别&#xff08;如出现Link输入参数不对等) 这大概率是因为缺少matlab工具箱&#xff0c;如图 需要下载该软件包&#xff0c;然后用Matlab打开&#xff0c;就能自动安装到matlab中。下载地址在这个超链接…

最强自动化测试框架Playwright(34)CDPSession

在 Playwright 中&#xff0c;CDPSession 类是用于与浏览器的 Chrome DevTools Protocol (CDP) 会话进行交互的对象。CDP 是与Chromium浏览器通信的底层协议&#xff0c;它提供了许多与浏览器进行交互和控制的功能。 CDPSession 类提供了执行底层 CDP 命令的方法&#xff0c;并…

linux--epoll

epoll 参考文献 https://www.cnblogs.com/lojunren/p/3856290.html https://www.51cto.com/article/717096.html linux下的I/O复用epoll详解 要深刻理解epoll&#xff0c;首先得了解epoll的三大关键要素&#xff1a;mmap、红黑树、链表。 IO多路复用 首先需要了解什么是IO多…

探讨uniapp的网络通信问题

uni-app 中有很多原生的 API&#xff0c;其中我们经常会用到的肯定有&#xff1a;uni.request(OBJECT) method 有效值 注意&#xff1a;method有效值必须大写&#xff0c;每个平台支持的method有效值不同&#xff0c;详细见下表。 success 返回参数说明 data 数据说明 最终…

应急响应-Webshell

文章目录 一、Webshell概述什么是WebshellWebshell分类基于编程语言基于文件大小/提供的功能多少 Webshell 检测方法 二、常规处置方法三、技术指南1、初步预判2、 Webshell排查3、Web日志分析&#xff08;查找攻击路径及失陷原因&#xff09;4、系统排查4.1 Windows4.2 Linux …

Jmeter 二次开发 函数助手 AES加解密

Jmeter 二次开发 函数助手 AES加解密 1. 环境准备2. 关键技术说明2.1 离线导包2.2 示例代码 3. 代码包4. 结果演示 1. 环境准备 IDE &#xff1a;IntelliJ IDEA 2021.1.1 x64JAVA环境 &#xff1a;jdk1.8.0_251离线导包&#xff1a;导入Jmeter安装目录下lib/ext下的ApacheJmet…

【使用群晖远程链接drive挂载电脑硬盘】

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

ViewFs And Federation On HDFS

序言 ViewFs 是在Federation的基础上提出的,用于通过一个HDFS路径来访问多个NameSpace,同时与ViewFs搭配的技术是client-side mount table(这个就是具体的规则配置信息可以放置在core.xml中,也可以放置在mountTable.xml中). 总的来说ViewFs的其实就是一个中间层,用于去连接不…

药品最新研究信息查询系统

查找最新药物研究进展信息在患者治疗选择、医疗实践、科学研究、药物监管和政策制定、教育和学术研究等方面都具有重要的应用价值。它可以为各个领域的人员提供最新的科学依据和决策支持&#xff0c;促进医学领域的发展和提高医疗质量。 但在查找药物最新研究进展信息时通常需要…

08 - 追加commit和修改最新的commit message

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 追加提交2. 修改最新的commit message 1. 追加提交 将改动追加到上一次的commit 现在我已经修改了Readme文件并且已经add、commit操作&#xff0c;但是还没有push到远程仓库&#x…

Kafka 什么速度那么快

批量发送消息 Kafka 采用了批量发送消息的方式&#xff0c;通过将多条消息按照分区进行分组&#xff0c;然后每次发送一个消息集合&#xff0c;看似很平常的一个手段&#xff0c;其实它大大提升了 Kafka 的吞吐量。 消息压缩 消息压缩的目的是为了进一步减少网络传输带宽。而…

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践

NLP文本匹配任务Text Matching [无监督训练]&#xff1a;SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度&#xff0c;该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…

【数据结构】 链表简介与单链表的实现

文章目录 ArrayList的缺陷链表链表的概念及结构链表的分类单向或者双向带头或者不带头循环或者非循环 单链表的实现创建单链表遍历链表得到单链表的长度查找是否包含关键字头插法尾插法任意位置插入删除第一次出现关键字为key的节点删除所有值为key的节点回收链表 总结 ArrayLi…

p5.js 渐变填充的实现方式

theme: smartblue 本文简介 p5.js 作为一款艺术类的 canvas 库&#xff0c;对颜色方面的支持是挺下功夫的&#xff0c;比如本文要介绍的渐变方法。 lerpColor() 要实现渐变效果&#xff0c;可以使用 lerpColor() 方法。 lerpColor 的作用是混合两个颜色以找到一个介于它们之间的…

Llama 2免费托管及API提供

Llama 2 是 Meta 最新的文本生成模型&#xff0c;目前其性能优于所有开源替代方案。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、强大的Llama 2 它击败了 Falcon-40B&#xff08;之前最好的开源基础模型&#xff09;&#xff0c;与 GPT-3.5 相当&#xff0c;仅低…

Springboot 在 redis 中使用 Guava 布隆过滤器机制

一、导入SpringBoot依赖 在pom.xml文件中&#xff0c;引入Spring Boot和Redis相关依赖 <!-- Google Guava 使用google的guava布隆过滤器实现--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><vers…