CCF CSP题解:因子化简(202312-2)

2024-08-29 09:20
文章标签 ccf csp 题解 因子 化简 202312

本文主要是介绍CCF CSP题解:因子化简(202312-2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接和思路

OJ链接:传送门。

问题重述

本题基于一个基本事实,即任何一个大整数 n n n都可以唯一地分解为如下形式
n = p 1 t 1 × p 2 t 2 × ⋯ × p m t m n = p_1^{t_1} \times p_2^{t_2} \times \cdots \times p_m^{t_m} n=p1t1×p2t2××pmtm其中, p 1 , p 2 , ⋯ , p m p_1, p_2, \cdots, p_m p1,p2,,pm表示 m m m个素因子,素因子上的幂 t i > 0 ( 1 ≤ i ≤ m ) t_i > 0 (1 \le i \le m) ti>0(1im)

本题给出 q q q n , k n,k n,k,满足 1 < n ≤ 1 0 10 , 1 < k , q ≤ 10 1 < n \le 10^{10}, 1 < k, q \le 10 1<n1010,1<k,q10,要求对每组 n , k n,k n,k,求出 n n n除以所有满足 t i < k t_i<k ti<k p i t i p_i^{t_i} piti后的结果,即求出
n ∏ 1 ≤ i ≤ m 且 t i < k p i t i = ∏ 1 ≤ i ≤ m 且 t i ≥ k p i t i \frac{n}{\prod_{1 \le i \le m 且 t_i<k}p_i^{t_i}} = \prod_{1 \le i \le m 且 t_i \ge k}p_i^{t_i} 1imti<kpitin=1imtikpiti

求解思路

由于 n n n较大,求出小于 n n n的所有的素数是很困难的。因此,我们考虑使用素数筛先求出 1 0 5 10^5 105以内的所有素数。如果出现有 p i > 1 0 5 p_i>10^5 pi>105的情况,则对应的 t i t_i ti必不可能大于1,只能等于1,且这样的 p i p_i pi最多只可能有1个。常见的素数筛有埃氏筛、欧拉筛等。本文使用埃氏筛,其实现如下:

static vector<long long> primes;
// 埃拉托斯特尼筛法,时间复杂度为O(n * loglogn)
void Find_Prime_number(long long n = N){vector<bool> flag(n + 1, true);//0和1不是素数,直接初始化好flag[0] = 0;flag[1] = 0;//从2开始,1不是素数for (long long i = 2; i <= n; i++){//如果当前数字是素数if (flag[i]){//i的倍数标记被不是素数for (long long j = i * i; j <= n; j += i)flag[j] = false;primes.push_back(i);}}
}

我们将素数筛获得的所有的 1 0 5 10^5 105以内的素数保存在vector<long long> primes中。然后,将 n n n依次尝试除以primes中的每个质因子 p i p_i pi。如果能够整除 p i p_i pi的次数大于等于 k k k,则说明 p i p_i pi是“重要的”,因此恢复到尝试除以 p i p_i pi之前的值。遍历完primes后,我们再处理可能存在的大于 1 0 5 10^5 105的质因子。

上文提到,如果存在 p i > 1 0 5 p_i > 10^5 pi>105,在本题的设定中,最多只可能有1个,且对应的 t i t_i ti只可能为1,由于 k > 1 = t i k>1=t_i k>1=ti,最终答案要剔除掉 p i t i p_i ^{t_i} piti

因此,我们需要引入如下函数,用以辅助判断 n n n除以 ∏ 1 ≤ i ≤ m 且 p i ≤ 1 0 5 p i t i \prod_{1 \le i \le m 且 p_i \le 10^5}p_i^{t_i} 1impi105piti后,是否是一个大于 1 0 5 10^5 105素数。如果是,最终结果应该除以这个素数。

bool is_prime(long long n){for (long long i = 2; i * i <= n; i++)if(n % i == 0)return false;return true;
}

AC代码

满分代码如下,使用CPP 11标准即可编译运行。
在这里插入图片描述

#include <iostream>
#include <vector>
using namespace std;const long long N = 1e5+5;static vector<long long> primes;// 埃拉托斯特尼筛法,时间复杂度为O(n * loglogn)
void Find_Prime_number(long long n = N){vector<bool> flag(n + 1, true);//0和1不是素数,直接初始化好flag[0] = 0;flag[1] = 0;//从2开始,1不是素数for (long long i = 2; i <= n; i++){//如果当前数字是素数if (flag[i]){//i的倍数标记被不是素数for (long long j = i * i; j <= n; j += i)flag[j] = false;primes.push_back(i);}}
}bool is_prime(long long n){for (long long i = 2; i * i <= n; i++)if(n % i == 0)return false;return true;
}int main() {Find_Prime_number();int q;cin >> q;while(q--) {long long  n;int k;cin >> n >> k;long long flag = n;for (long long prime: primes) {long long tmp = n;int cnt = 0;while (n % prime == 0){n /= prime;flag /= prime;cnt++;}if (cnt >= k)   // 如果t_i足够大,说明不需要除以p_in = tmp;    // 恢复}if (flag > N && is_prime(flag)){// 如果存在大于N的质因子p_i,其对应的t_i=1<k,需要去除n /= flag;}cout << n << endl;}return 0;
}

这篇关于CCF CSP题解:因子化简(202312-2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117452

相关文章

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CCF推荐C类会议和期刊总结(计算机网络领域)

CCF推荐C类会议和期刊总结(计算机网络领域) 在计算机网络领域,中国计算机学会(CCF)推荐的C类会议和期刊为研究者提供了广泛的学术交流平台。以下是对所有C类会议和期刊的总结,包括全称、出版社、dblp文献网址以及所属领域。 目录 CCF推荐C类会议和期刊总结(计算机网络领域) C类期刊 1. Ad Hoc Networks 2. CC 3. TNSM 4. IET Com

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数