题目
题解思路
将每个底数质因数分解 ,取每个质因数的最低幂次(乘之前的幂次)即可。
最后gcd出底数序列的最大公约数。
再将最大公约数分解质因数。
通过预处理的每个质因子的幂次运用快速幂相乘即可。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 10010;
const int mod = 1e9 + 7 ;
long long a[N] ;
long long p[N] ;
long long vis[N] ;
long long ksm( long long di , long long mi )
{
long long res = 1 ;
while (mi)
{
if (mi & 1 )
res = res * di % mod ;
mi >>= 1 ;
di = di * di % mod ;
}
return res ;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n ;
cin >> n ;
for (int i = 1 ; i <= n ; i++ )
cin >> a[i] ;
for (int i = 1 ; i <= n ; i++ )
cin >> p[i] ;
if ( n == 1 )
{
cout << ksm(a[1],p[1])<<"\n" ;
}else
{
unordered_map <long long , long long > mp ;
long long res = -1 ;
for (int i = 1 ; i <= n ; i++ )
{
long long st = a[i] ;
for (long long j = 2 ; j * j <= st ; j++ )
{
if ( st % j == 0 )
{
long long cnt = 0 ;
while ( st % j == 0 )
{
st /= j ;
cnt++;
}
if ( mp[j] == 0 )
{
mp[j] = p[i]*cnt ;
}else
{
mp[j] = min( mp[j] , p[i]*cnt ) ;
}
}
}
if ( st != 1 )
{
if (mp[st] == 0 )
mp[st] = p[i] ;
else
mp[st] = min( p[i] , mp[st] ) ;
}
}
for (int i = 1 ; i <= n ; i++ )
{
if (res == -1 )
res = a[i] ;
else
res = __gcd(res , a[i] ) ;
}
//cout << res << "\n" ;
long long ans = 1 ;
for (long long i = 2 ; i*i <= res ; i++ )
{
if ( res % i == 0 )
{
while ( res % i == 0 )
res /= i ;
ans = ans * ksm(i,mp[i]) % mod ;
}
}
if ( res != 1 )
ans = ans * ksm(res,mp[res]) % mod ;
cout << ans << "\n" ;
}
return 0 ;
}