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;
}