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

news2025/1/17 0:10:34

【题目来源】
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

 

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

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

相关文章

<kernel>kernel 6.4 USB-之-hub_port_connect_change()分析

&#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_port_connect_change()分析 kernel 6.4 USB系列文章如下&#xff1a; &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_event()分析 &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-port_event()分析 本文是基…

kubernetes--技术文档--基本概念--《10分钟快速了解》

官网主页&#xff1a; Kubernetes 什么是k8s Kubernetes 也称为 K8s&#xff0c;是用于自动部署、扩缩和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元&#xff0c;以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验&#xff0c…

最长重复子数组(力扣)动态规划 JAVA

给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。 示例 2&#xff1a; 输…

Visual Studio 2019源码编译cpu版本onnxruntime

1.下载onnxruntime源码 源码地址&#xff1a;gitee 》https://gitee.com/mirrors/onnx-runtime github 》https://github.com/microsoft/onnxruntime git clone --recursive https://gitee.com/mirrors/onnx-runtime 2.安装anaconda并配置python环境 安装anaconda时记得勾选默…

关于分压电阻电路电压的计算

分压电路是低成本测量电压的方法 1.知道Vin,R1,R2,求Vout Vout Vin / (R1/(R1R2)) 6/(10/20)3V 2.知道Vou,R1,R2,求Vin Vin Vout*(R1R2)/R2 3 *(1010)/10 6V

如遭遇DDoS等攻击会对企业和个人造成严重影响,包括以下

1. 服务不可用&#xff1a;正常用户无法访问目标服务器&#xff0c;导致业务中断&#xff0c;影响用户体验。 2. 数据泄露&#xff1a;攻击者可能会在攻击过程中窃取用户数据&#xff0c;导致隐私泄露和财产损失。 3. 经济损失&#xff1a;由于服务中断&#xff0c;企业可能遭受…

CSS 背景属性

前言 背景属性 属性说明background-color背景颜色background-image背景图background-repeat背景图平铺方式background-position背景图位置background-size背景图缩放background-attachment背景图固定background背景复合属性 背景颜色 可以使用background-color属性来设置背景…

el-transfer穿梭框使用(传值、清空)

一、组件的使用 <el-transferref"myTransfer"filterable:titles"[待选用户, 已选用户]":filter-method"filterMethod"filter-placeholder"请输入关键字查询"v-model"selectedUserIds":data"userData":props&qu…

DyLoRA:使用动态无搜索低秩适应的预训练模型的参数有效微调

又一个针对LoRA的改进方法&#xff1a; DyLoRA: Parameter-Efficient Tuning of Pretrained Models using Dynamic Search-Free Low Rank Adaptation https://arxiv.org/pdf/2210.07558v2.pdf https://github.com/huawei-noah/KD-NLP/tree/main/DyLoRA Part1前言 LoRA存在…

秋招刷题网站推荐

codefun2000.com 最近准备秋招发现了这个网站&#xff0c;里面的题目都是acm输入输出的&#xff0c;包括了最近开的一些公司的笔试真题&#xff0c;秋招笔试就靠这个练习了。 而且里面还有博客和思维导图&#xff0c;讲解比较全面&#xff0c;还能在评论区求助大佬解答。

基于 Debian 12 的MX Linux 23 正式发布!

导读MX Linux 是基于 Debian 稳定分支的面向桌面的 Linux 发行&#xff0c;它是 antiX 及早先的 MEPIS Linux 社区合作的产物。它采用 Xfce 作为默认桌面环境&#xff0c;是一份中量级操作系统&#xff0c;并被设计为优雅而高效的桌面与如下特性的结合&#xff1a;配置简单、高…

数据化决策,揭秘BI工具与数据可视化的魔力

在当今数据驱动的时代&#xff0c;企业越来越需要深入了解自身运营情况&#xff0c;以便做出明智的决策和战略规划。在这个背景下&#xff0c;商业智能&#xff08;Business Intelligence&#xff0c;简称BI&#xff09;工具和数据可视化技术逐渐崭露头角&#xff0c;成为企业成…

tcpip协议族

现在Internet(因特网&#xff09;使用的主流协议族是TCP/IP协议族&#xff0c;它是一个分层、多协议的通信体系。TCP/IP协议族是一个四层协议系统&#xff0c;自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的能&#xff0c;且通过若干协议来实现&#xff…

CW4-3A-S(004)CW4-6A-S(004)CW4-10A-S(004)CW4-20A-S(004)CW4-30A-S(004)端子台式滤波器

CW4L3-3A-S(003) CW4L3-6A-S(003) CW4L3-10A-S(003) CW4L3-20A-S(003) CW4L3-30A-S(003)端子台式滤波器 CW4-3A-S(004) CW4-6A-S(004) CW4-10A-S(004) CW4-20A-S(004) CW4-30A-S(004)端子台式滤波器 CW4L4-3A-R CW4L4--6A-R CW4L4-10A-R CW4L4-20A-R CW4L4-30A-R端…

字节二面:10Wqps会员系统,如何设计?

说在前面 在尼恩的&#xff08;50&#xff09;读者社区中&#xff0c;经常遇到一个 非常、非常高频的一个面试题&#xff0c;但是很不好回答&#xff0c;类似如下&#xff1a; 千万级数据&#xff0c;如何做系统架构&#xff1f; 亿级数据&#xff0c;如何做系统架构&#xf…

工业物联网网关是什么?有什么作用?

工业物联网网关是工业领域中的一种重要设备&#xff0c;它在工业物联网系统中充当桥梁和连接器的角色。作为边缘计算的关键组件之一&#xff0c;工业物联网网关用于实现工业设备、传感器、PLC、DCS、OPC等各种设备的数据采集、处理、转发和控制。它在工业物联网系统中发挥着关键…

BEiT: BERT Pre-Training of Image Transformers 论文笔记

BEiT: BERT Pre-Training of Image Transformers 论文笔记 论文名称&#xff1a;BEiT: BERT Pre-Training of Image Transformers 论文地址&#xff1a;2106.08254] BEiT: BERT Pre-Training of Image Transformers (arxiv.org) 代码地址&#xff1a;unilm/beit at master …

恒运资本:如何融券做空?融资做多?

在股票商场经常听到做多、做空两种战略。那么。如何融券做空&#xff1f;融资做多&#xff1f;下面恒运资本为大家准备了相关内容&#xff0c;以供参阅。 如何融券做空&#xff1f; 融券做空的意思是投资者以为未来某只股票会跌落&#xff0c;因而向证券公司借入某只股票&…

浅谈智能建筑中电力监控系统的应用与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;近几十年&#xff0c;中国现代化经济不断发展&#xff0c;计算机技术、信息技术等相关产业也取得了飞跃性的进步。随着商业、生活以及公共建筑不断提高智能管理和节能的要求&#xff0c;电力监控系统开始逐渐渗…