Codeforces Round #338 (Div. 2)-D Multipliers(所有因数之积)

D. Multipliers
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Ayrat has number n, represented as it's prime factorization pi of size m, i.e. n = p1·p2·...·pm. Ayrat got secret information that that the product of all divisors of n taken modulo 109 + 7 is the password to the secret data base. Now he wants to calculate this value.

Input

The first line of the input contains a single integer m (1 ≤ m ≤ 200 000) — the number of primes in factorization of n.

The second line contains m primes numbers pi (2 ≤ pi ≤ 200 000).

Output

Print one integer — the product of all divisors of n modulo 109 + 7.

Examples
input
2
2 3
output
36
input
3
2 3 2
output
1728
Note

In the first sample n = 2·3 = 6. The divisors of 6 are 123 and 6, their product is equal to 1·2·3·6 = 36.

In the second sample 2·3·2 = 12. The divisors of 12 are 12346 and 121·2·3·4·6·12 = 1728.


题意:给你 n 个素数,让你求它们相乘之后的数的因子之积

题解:思路来自:http://blog.csdn.net/helloiamclh/article/details/52190564

#include<stdio.h>  
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 1010000
#define mod 1000000007
__int64 cnt[maxn];
__int64 q(__int64 x,__int64 y)
{
	__int64 res=1;
	while(y)
	{
		if(y%2)
			res=res*x%mod;
		x=x*x%mod;
		y/=2;
	}
	return res;
}
int main(void)
{
	__int64 m,i,x;
	scanf("%I64d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%I64d",&x);
		cnt[x]++;
	}
	__int64 sum=1;
	for(i=1;i<=200000;i++)
		if(cnt[i])
			sum=(sum*(1+cnt[i]))%(2*mod-2);
	__int64 ans=1;
	for(i=1;i<=200000;i++)
		if(cnt[i])
			 ans=(ans*q(i,cnt[i]*sum/2))%mod;
	printf("%I64d\n",ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值