首页 > 其他分享 >多个数的质因数分解

多个数的质因数分解

时间:2024-07-27 11:51:58浏览次数:17  
标签:prime cnt 因数分解 多个 int vis ans

多个数的质因数分解

题目:2024江西ICPC D. Magic LCM

思路:因为每次操作一定会使 x+y 变大或者不变,所以就一直换到不变的情况,而不变的情况中x和y是倍数关系,那我们就将所有的数进行质因数分解,用map<int, vector>来保存每个质数出现的幂次
例如第三个样例:
5 -> 1
2 -> 2 2 1 1
3 -> 3 2 1 1
ans = 5^1 * 2^2 * 3^3 + 2^2 * 3^2 + 2 * 3 + 2 * 3 + 1 + 1
ans = 540 + 36 + 12 + 2 = 590

优化:比赛当时思路是这样想的,但是最后超时了,就差一些优化(要是过了就有金牌了QAQ)
比如质因数分解,我们在用欧拉筛的时候可以顺便把每个数的最小质因数求出来,之后质因数分解时直接除最小质因数
还有最后的计算,我们可以用一个ans数组,初始化为1,遍历质数次幂vector的时候在每个位置上直接乘就行了

欧拉筛求质数和每个数的最小质因数:

点击查看代码
int prime[100000];
int vis[N];
int euler(int n){
    int cnt = 0;
    for(int i = 2; i <= n; i ++){
        if(!vis[i]) {
            vis[i] = i;
            prime[cnt ++] = i;
        }
        for(int j = 0; j < cnt; j ++){
            if(i * prime[j] > n) break;
            vis[i * prime[j]] = prime[j];
            if(i % prime[j] == 0) break;
        }
    }
    return cnt;
}

整体代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define int long long
const int N = 1e6 + 5;
const int mod = 998244353;
int prime[100000];
int vis[N];
int euler(int n){
    int cnt = 0;
    for(int i = 2; i <= n; i ++){
        if(!vis[i]) {
            vis[i] = i;
            prime[cnt ++] = i;
        }
        for(int j = 0; j < cnt; j ++){
            if(i * prime[j] > n) break;
            vis[i * prime[j]] = prime[j];
            if(i % prime[j] == 0) break;
        }
    }
    return cnt;
}
int fastpower(int a, int n){
    int ans = 1;
    while(n){
        if(n & 1) ans = (ans * a) % mod;
        a = (a * a) % mod;
        n >>= 1;
    }
    return ans;
}

void solve(){
    unordered_map<int, vector<int> > mp;
    int n; cin >> n;

    for(int i = 1; i <= n; i ++){
        int a; cin >> a;
        while(a != 1){
            int p = vis[a];
            int cnt = 0;
            while(vis[a] == p){
                cnt ++;
                a /= p;
            }
            mp[p].push_back(cnt);
        }
    }

    for(auto [p, a] : mp){
        cout << p << " -> ";
        sort(a.begin(),a.end(),greater<int>());
        for(int v : a){
            cout << v << " ";
        }
        cout << "\n";
    }
    int res[n + 1];
    for(int i = 0; i < n; i ++) res[i] = 1;
    int ans = 0;
    for(auto [p, a] : mp){
        sort(a.begin(), a.end(), greater<int>());
        for(int i = 0; i < a.size(); i ++){
            res[i] = (res[i] * fastpower(p, a[i])) % mod;
        }
    }
    for(int i = 0; i < n; i ++) ans = (ans + res[i]) % mod;
    cout << ans << "\n";
}

signed main(){
    IOS;
    euler(N - 5);
    int t = 1;
    cin >> t;
    while (t --){
        solve();
    }
    return 0;
}

标签:prime,cnt,因数分解,多个,int,vis,ans
From: https://www.cnblogs.com/DHMO/p/18325801

相关文章

  • Python 3 使用 super() 函数时出现“类型错误:__init__() 获得多个参数值”
    我正在使用继承的Python3编写一个OOP程序,当我尝试像这样初始化子类时遇到标题错误:classParent:def__init__(self,var1,var2):self.var1=var1self.var2=var2#moremethodsthattosomestuffclassChild(Parent):a=1#aan......
  • 按比例分割具有多个目标列的数据框
    我有一个30行10列的数据框。其中5列是输入特征,另外5列是输出/目标列。目标列包含表示为0、1、2的类。我想将数据集拆分为训练和测试,以便在训练集中,对于每个输出列,比例1级的值在0.15和0.3之间。(我不关心测试集中类的分布)。附加......
  • 具有两个或多个返回参数的函数注释
    当我为返回一个参数的函数编写注释时,我没有任何问题。deffunc()->str:return"ok"但是,当我编写带有两个或更多参数的注释时,我的PyCharm给我SyntaxError:invalidsyntaxdeffunc()->str,str:return"ok-1","ok-2"我认为参数可以与......
  • 将多个文件并行读取到 Pyspark 中的单独数据帧中
    我正在尝试将大型txt文件读入数据帧。每个文件大小为10-15GB,因为IO需要很长时间。我想并行读取多个文件并将它们放入单独的数据帧中。我尝试了下面的代码frommultiprocessing.poolimportThreadPooldefread_file(file_path):returnspark.read.csv(file......
  • 合并多个字体文件
    合并多个字体文件本教程由做字体网(www.zuoziti.com)友情提供!本教程是制作手写字体系列教程,建议从序言部分开始阅读学习!如需交流,请加QQ924268440本节视频教程合并多个字体文件前面我说过FontForge一次性导入太多的小图片会出现卡死的情况,我们最好是分批导入,这样就会......
  • ToDesk的诈骗事件别害怕!荣获多个机构安全认证
    临近年关,诈骗事件层出不求,小社长注意到远控软件ToDesk最近又被骗子利用来盗取用户信息。原理就是通过话术让受害者交出远程控制软件的密码,通过电话一步步指使受害者操作设备,达到骗子的目的。从近期的诈骗事件来看,根据小社长的了解的过程细节,ToDesk属实无辜,好端端的被骗子拿来当......
  • 基于GD32的矩阵按键usb-hid设备,详细教程,完全模拟的电脑数字键盘的所有功能,包括长按、
    本文采用的是基于GD32F350的一个4×5的矩阵键盘键盘板。矩阵键盘的电路原理图大致如下,由四个列引脚和五个行引脚来检测判断按键的按下。本文四个列引脚分别是PA15PB8PB9PC13,五个行引脚分别是PB10PB11PB12PB13PB14。typedefstruct{uint32_tGPIO_Group;......
  • 多个箱线图,其中包含 for 循环保存输出中文件的数据?
    我正在使用保存在要绘制箱线图的文件中的一些数据。每个文件(第3行)中有27个值,每个文件我希望成为沿x轴5'的单独箱线图然后,我还希望将每个文件作为单个箱线图进行概述,因为我有10个“对象”(使用所有5个文件27个值(135个值)作为单个箱线图)我已经开始在代码......
  • 【YashanDB知识库】绑定参数,同一个sql多个执行计划的问题
    问题现象同一个sql有两个执行计划,是否合理?它的EXECUTIONS,ELAPSED_TIME等统计信息怎么看,是独立分开的还是统一计算的?如下图:问题影响版本tpcc测试:23.2.1.100问题的风险及影响影响EXECUTIONS等sql统计信息的计算问题发生原因同一条sql,特别是绑定参数的sql,参数类型不同,会导......
  • IIS同一站点下发布两个或多个net8、net core应用程序池
    IIS同一站点下布两个net8、netcore报“ASP.NETCoredoesnotsupportmultipleappsinthesameapppool”,意思是多个.netcore程序不支持同一个程序池。那我们手动在创建一个程序池,分给另一个应用程序就可以了。步骤如下:1、点击IIS“应用程序池”-》添加应用程序池 2、......