1 条题解

  • 0
    @ 2025-8-24 22:32:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar LMB_002
    14U小佬,有大佬带我吗(kill 6s

    搬运于2025-08-24 22:32:16,当前版本为作者最后更新于2023-07-20 18:19:41,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这是蒟蒻写的第一篇题解

    题目传送门

    一、简述题意


    给定有 nn 个正整数的数列 aa

    每次操作可以从中选定两个正整数 aia_iaja_j

    在能除尽的情况下,将 aia_iaja_j 的其中一个乘上一个质数 pp ,另外一个除以同一个质数 pp

    求解:经过若干次操作之后,所得到的数列 aa' 中所有数的最大公因数最大是多少?使得最大公因数最大的操作次数最少是多少?

    二、思路分析


    考虑先将每一个数分解质因数,把所有的质因数的指数和记录在一个数组里。再枚举每个数,取他们的指数的平均数。答案是他们的每个幂的和与平均数与指数的差的和。

    三、代码实现


    上代码!!!

    #include<bits/stdc++.h>
    using namespace std;
    long long n,a[105],d[1000005],maxn,ans1=1,ans2;
    int main() {
    	scanf("%lld",&n);
    	for(long long i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		long long p=a[i];
    		for(long long j=2;j*j<=p;j++){
    			while(p%j==0){
    				p/=j;
    				d[j]++;
    			}
    		}if(p) d[p]++;
    		maxn=max(maxn,a[i]);//质因数分解
    	}
    	for(long long i=2;i<=maxn;i++){
    		long long p=d[i]/n,k=0;
    		ans1*=pow(i,p);
    		if(p){//能判断成功的数一定是质数
    			for(long long j=1;j<=n;j++){
    				long long c=0;
    				while(a[j]%i==0){
    					a[j]/=i;
    					c++;
    				}
    				if(c<p) k+=p-c;
    			}ans2+=k;
    		}
    	}printf("%lld %lld",ans1,ans2);
    	return 0;
    }
    
    
    • 1

    信息

    ID
    7041
    时间
    1000ms
    内存
    32MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者