2021牛客寒假算法基础集训营4 J.邬澄瑶的公约数(分解质因数)

J.邬澄瑶的公约数

题目链接:https://ac.nowcoder.com/acm/contest/9984/J

题目描述:

众所周知,邬澄瑶正在学习欧几里得算法。

现在她已经可以轻松求解gcd(x1 ,⋯,xn),并为此洋洋得意。为了整治狂妄自大的邬澄瑶,她的室友把在这里插入图片描述 这个式子甩给了他。

邬澄瑶被难住了,只好来求助于你,希望你帮她求出这个式子。

由于结果可能很大,你需要对 1e9+7 取模。

特别的,邬澄瑶的室友认为 gcd(x)=x 。

输入描述:

第一行一个数表示 n 。

第二行 n 个数,第 i 个数表示 xi。

第三行 n 个数,第 i 个数表示pi。

其中,1≤n,xi,pi ≤1e4 。

输出描述:

输出一行一个数表示答案。

扫描二维码关注公众号,回复: 12855554 查看本文章

示例1:

输入
2
9 3
1 2
输出
9
说明
在这里插入图片描述

解题思路:

分解质因数
求gcd(x1,…xn)即分解质因数,找到公共因子,以及这个因子出现的最小次数。
对于本题来说,求的是在这里插入图片描述
也就是需要在gcd(x1,…xn)的基础上找到出现n次的质因子的最小次数然后乘上Pi。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define ll long long
const int mod=1e9+7;
int x[10010],p[10010];
int main(){
    
    
    int n;
    ll ans=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
    
    
        scanf("%d",&x[i]);
    }
    for(int i=1;i<=n;i++){
    
    
        scanf("%d",&p[i]);
    }
    for(int i=2;i<=10000;i++){
    
    
        ll cnt=1e9;
        for(int j=1;j<=n;j++){
    
    
            ll t=0;
            while(x[j]%i==0){
    
    
                t++;
                x[j]/=i;
            }
            cnt=min(cnt,t*p[j]);
        }
        for(int j=1;j<=cnt;j++)
            ans=ans*i%mod;
    }
    printf("%lld", ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45894701/article/details/113865583