【14.67%】【codeforces 615D】Multipliers
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard 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 1, 2, 3 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 1, 2, 3, 4, 6 and 12. 1·2·3·4·6·12 = 1728.
【题解】
数论问题;先搞出质数的总数a[0];存在a[1..a[0]]中;
用cnt[x]表示x这个数字的数目;
用l[n]表示∏(cnt[a[i]]+1);i=1..n
用r[n]表示∏(cnt[a[i]]+1);i=n..a[0];
则枚举每个数字a[i];
对于1..i-1和i+1..a[0]这些数字;
它们的组合有l[i-1]*r[i+1]个;
a[i]要参与到这些组合中;
那么最后会乘进去多少个a[i]呢;
显然a[i]^x就会乘进去x个a[i];
即
(a[i]^1)^(l[i-1]*1*r[i+1])
(a[i]^2)^(l[i-1]*2*r[i+1])
(a[i]^3)^(l[i-1]*3*r[i+1])
…
(a[i]^cnt[a[i]])^(l[i-1]*cnt[a[i]]*r[i+1])
最后会全部乘起来;
即a[i]^(l[i-1]r[i+1](1+2+3..+cnt[a[i]]))
即a[i]^(l[i-1]r[i+1]*cnt[a[i]](cnt[a[i]]+1)/2);
这个数字的指数是很恐怖的;
a[i]^(l[i-1]r[i+1]*cnt[a[i]](cnt[a[i]]+1)/2)
需要用费马小定理搞一搞;
下面是证明;
最上面那行是费马小定理;
这个费马小定理要求p和a是互质的;
而P是1e9+7是质数
a[i]最大20W小于P显然a[i]和p互质;则
a[i]^(l[i-1]r[i+1]*cnt[a[i]](cnt[a[i]]+1)/2) % p==a[i]^(l[i-1]r[i+1]*cnt[a[i]](cnt[a[i]]+1)/2%(p-1)) % p;
然后快速幂搞下就好;
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#define lson L,m,rt<<1
#define rson m+1,R,rt<<1|1
#define LL long long
using namespace std;
const int MAXN = 2e5;
const int MOD = 1e9+7;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0);
LL ans = 1,l[MAXN+100],r[MAXN+100],cnt[MAXN+100];
int m;
LL a[MAXN+100] = {0};
vector <LL> pre[MAXN];
void input_LL(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
void input_int(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
}
LL ksm(LL a,LL x)
{
if (x==0)
return 1;
LL temp = ksm(a,x>>1);
temp = (temp*temp)%MOD;
if (x&1)
temp = (temp*a)%MOD;
return temp;
}
int main()
{
input_int(m);
for (int i = 1;i <= m;i++)
{
int x;
input_int(x);
cnt[x]++;
}
for (int i = 2;i <= MAXN;i++)
if (cnt[i])
a[++a[0]] = i;
l[0] = 1;r[a[0]+1] = 1;
for (int i = 1;i<=a[0];i++)
l[i] = (l[i-1]*(cnt[a[i]]+1))%(MOD-1);
for (int i = a[0];i>=1;i--)
r[i] = (r[i+1]*(cnt[a[i]]+1))%(MOD-1);
for (int i = 1;i <= a[0];i++)
{
LL temp1 = ((cnt[a[i]]*(cnt[a[i]]+1))/2)%(MOD-1);
LL temp2 = (l[i-1]*r[i+1])%(MOD-1);
LL temp = ksm(a[i],(temp1*temp2)%(MOD-1));
ans = (ans * temp)%MOD;
}
printf("%I64d\n",ans);
return 0;
}
【14.67%】【codeforces 615D】Multipliers的更多相关文章
- 【 BowWow and the Timetable CodeForces - 1204A 】【思维】
题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...
- 【24.67%】【codeforces 551C】 GukiZ hates Boxes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【26.67%】【codeforces 596C】Wilbur and Points
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- 【codeforces 67A】Partial Teacher
[题目链接]:http://codeforces.com/problemset/problem/67/A [题意] 给一个长度为n-1的字符串; 每个字符串是'L','R','='这3种字符中的一个; ...
- 【77.78%】【codeforces 625C】K-special Tables
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【codeforces 754D】Fedor and coupons
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 760A】Petr and a calendar
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【codeforces 750E】New Year and Old Subsequence
time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
随机推荐
- PatentTips - Adaptive algorithm for selecting a virtualization algorithm in virtual machine environments
BACKGROUND A Virtual Machine (VM) is an efficient, isolated duplicate of a real computer system. Mor ...
- oled的一套stm32实验2(自己的实验)
stm32与OLED屏接口的引脚介绍: CS————GPIOD3: RST————GPIOD4: DC—————GPIOD5: D0——————GPIOD6: D1——————GPIOD7; 上是我参 ...
- (转)iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链
转自:http://lesca.me/archives/iptables-examples.html 本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇ipt ...
- PHP URL参数获取方式的四种例子
在已知URL参数的情况下,我们可以根据自身情况采用$_GET来获取相应的参数信息($_GET['name']);那,在未知情况下如何获取到URL上的参数信息呢? 第一种.利用$_SERVER内置数组变 ...
- 【b702】字符串的展开
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 在初赛普及组的"阅读程序写结果"的问题中,我们曾给出一个字符串展开的例子:如果在输入 ...
- 使用ganglia监控hadoop及hbase集群 分类: B3_LINUX 2015-03-06 20:53 646人阅读 评论(0) 收藏
介绍性内容来自:http://www.uml.org.cn/sjjm/201305171.asp 一.Ganglia简介 Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测 ...
- Jquery浅克隆与深克隆是什么
Jquery浅克隆与深克隆是什么 一.总结 一句话总结:克隆的那些标签内容就是对应元素的html,事件就是那些绑定的事件. 1.jquery克隆的时候的注意事项是什么? 元素数据(data)内对象和数 ...
- 服务器负载均衡lvs(Linux Virtual Server)
服务器负载均衡lvs(Linux Virtual Server) 一.总结 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 三.Linu ...
- [Recompose] Render Nothing in Place of a Component using Recompose
Learn how to use the ‘branch’ and ‘renderNothing’ higher-ordercomponents to render nothing when a ce ...
- C++实现简单的内存块自己主动管理
#ifndef __MEM__H #define __MEM__H #include<iostream> using namespace std; //自己主动管理内存块 typedef ...