列表

详情


NC16778. 黑妹的游戏III

描述

黑妹又开始玩起了一个游戏,这次她面对的是一个序列,序列里的每个数字都是正整数,黑妹每次可以从这个序列里选择两个数字,然后将这两个数字除以它们任意一个公共因子。
如果 x 是 a 和 b 的公共因子,当且仅当 a 和 b 都能被 x 整除。
黑妹很快玩腻了这些操作,她现在想知道,这个序列经过一些操作之后,将新序列的每个元素都乘起来的最小乘积是多少,由于这个乘积可能很大,所以你需要告诉黑妹这个乘积对109+7取模之后的值。

输入描述

第一行一个整数T表示数据的组数。(1 ≤ T ≤ 10)

对于每组数据:

第一行n表示序列的长度。(1 ≤ n ≤ 10000)

接下来一行n个整数ai表示序列的每个元素。(1 ≤ ai ≤ 108)

输出描述

对于每组数据输出一行表示答案。

示例1

输入:

3
3
1 2 3
4
8 8 9 9
5
4 8 12 18 22

输出:

6
1
66

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 487ms, 内存消耗: 1876K, 提交时间: 2020-07-26 10:29:25

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int mod=1e9+7;
int n,res;	unordered_map<int,int> mp,mx;
inline int qmi(int a,int b){
	int res=1;
	while(b){if(b&1) res=1LL*res*a%mod; a=1LL*a*a%mod; b>>=1;}
	return res;
}
inline void solve(){
	cin>>n;
	mp.clear(),mx.clear(); res=1;
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);
		for(int j=2;j*j<=x;j++)	if(x%j==0){
			int cnt=0;
			while(x%j==0)	x/=j,cnt++;
			mp[j]+=cnt,mx[j]=max(mx[j],cnt);
		}
		if(x>1)	mp[x]++,mx[x]=max(mx[x],1);
	}
	for(auto i:mp){
		int x=i.first,y=i.second;
		if(2*mx[x]<=y)	res=1LL*res*(y%2?x:1)%mod;
		else	res=1LL*res*qmi(x,2*mx[x]-y)%mod;
	}
	printf("%d\n",res);
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

C++ 解法, 执行用时: 463ms, 内存消耗: 1120K, 提交时间: 2021-11-24 15:44:36

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int mod=1e9+7;
int n,res;	unordered_map<int,int> mp,mx;
inline int qmi(int a,int b){
	int res=1;
	while(b){if(b&1) res=1LL*res*a%mod; a=1LL*a*a%mod; b>>=1;}
	return res;
}
inline void solve(){
	cin>>n;
	mp.clear(),mx.clear(); res=1;
	for(int i=1,x;i<=n;i++){
		scanf("%d",&x);
		for(int j=2;j*j<=x;j++)	if(x%j==0){
			int cnt=0;
			while(x%j==0)	x/=j,cnt++;
			mp[j]+=cnt,mx[j]=max(mx[j],cnt);
		}
		if(x>1)	mp[x]++,mx[x]=max(mx[x],1);
	}
	for(auto i:mp){
		int x=i.first,y=i.second;
		if(2*mx[x]<=y)	res=1LL*res*(y%2?x:1)%mod;
		else	res=1LL*res*qmi(x,2*mx[x]-y)%mod;
	}
	printf("%d\n",res);
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

上一题