给定n个正整数a1,a2,…,an,求

的值(答案模10^9+7)。

Input

第一行一个正整数n。
接下来n行,每行一个正整数,分别为a1,a2,…,an。

Output

仅一行答案。

Sample Input

3
6
10
15

Sample Output

1595

Hint

1<=n<=10^5,1<=ai<=10^7。共3组数据。


  题目大意 (题目过于简洁,完全不需要大意)

  题目虽然很简洁,但是处处挖着坑等你跳。

  原计划两个小时把今天讲的例题A完,实际上两个小时都被这道题坑走了(懒惰于重新推公式的下场。。。)

  //假设读者知道什么是积性函数以及欧拉函数的积性

  欧拉函数的积性可以表现在这种形式(里面p + 下标都表示互不相同的质数):

  所以,我们可以把每个不同的素数分开进行计算贡献,然后再求积(因为我们是把每个像上述形式拆分求phi值,所以是求积)。

  于是我们成功得到了某个更长的式子:(其中b(p)i表示ai中质因子p的指数)

  由于欧拉函数在此不好运用某些套路快速求结果,所以考虑运用欧拉函数神奇的性质将其拆开。我们知道有关欧拉函数有(同样,p是质数)

  虽然当指数为0的时候为特殊情况,但是可以加点黑科技是它不是那么地特殊:

  是滴,多加了一个1/p就解决了问题。现在继续化简:

$\prod_{p\ is\ a\ prime}\frac{1}{p} + \frac{p - 1}{p}\left ( \sum_{i_{1} = 0}^{b_{\left ( p \right )1}}p^{i_{1}} \right )\cdots \left( \sum_{i_{n} = 0}^{b_{\left ( p \right )n}}p^{i_{n}} \right )$

  然后得到了:

$\prod_{p\ is\ a\ prime}\frac{1 + \left (p - 1  \right )\left ( \sum_{i_{1} = 0}^{b_{\left ( p \right )1}}p^{i_{1}} \right )\cdots \left( \sum_{i_{n} = 0}^{b_{\left ( p \right )n}}p^{i_{n}} \right )}{p}$

  此时计算的时间复杂度能够接受。但是由于在模意义下做除法需要乘逆元,由于p是小于1e7的质数,所以一定和1e9 + 7互质,所以逆元一定存在。

  关于这道题还有很神奇的东西,存有哪些不同的素数用STL(Standard Templates Library Sometimes/Standard TLE/MLE Library),然而MLE。。。求解释。。。好像和理论算的不太一样。。

  所以就用一个黑科技。用pair的第一位存是什么素数,第二位存指数。然后sort一下,就可以AC了。

Code

 /**
* bzoj
* Problem#3560
* Accepted
* Time: 1276ms
* Memory: 7940k
*/
#include <bits/stdc++.h>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean;
#define smax(a, b) a = max(a, b)
#define LL long long const int moder = 1e9 + ;
LL mpow(LL a, LL pos) {
if(pos == ) return ;
if(pos == ) return a;
LL temp = mpow(a, pos >> );
temp = (temp * temp) % moder;
if(pos & ) temp = (temp * a) % moder;
return temp;
} void exgcd(LL a, LL b, LL& d, LL& x, LL& y) {
if(!b) {
d = a;
x = , y = ;
} else {
exgcd(b, a % b, d, y, x);
y -= (a / b) * x;
}
} int inv(int a, int moder) {
LL d, x, y;
exgcd(a, moder, d, x, y);
return (x < ) ? (x + moder) : (x);
} const int limit = ;
int num = ;
int prime[];
boolean vis[limit + ];
inline void Euler() {
for(int i = ; i <= limit; i++) {
if(!vis[i]) prime[num++] = i;
for(int j = ; j < num && i * prime[j] <= limit; j++) {
vis[i * prime[j]] = true;
if((i % prime[j] == ))
break;
}
}
} int n;
int* arr;
int cnt = ;
pair<int, int> ds[];
inline void init() {
scanf("%d", &n);
arr = new int[(n + )];
for(int i = ; i <= n; i++) {
scanf("%d", arr + i);
}
} LL getSum(int p, int c) {
LL a = (mpow(p, c + ) - );
LL b = inv(p - , moder);
return (a * b) % moder;
} LL res = ;
inline void solve() {
for(int i = , x; i <= n; i++) {
x = arr[i];
for(int j = ; prime[j] * prime[j] <= x && arr[i] > ; j++) {
if((arr[i] % prime[j]) == ) {
ds[cnt].first = prime[j], ds[cnt].second = ;
while((arr[i] % prime[j]) == )
arr[i] /= prime[j], ds[cnt].second++;
cnt++;
}
}
if(arr[i] > )
ds[cnt].first = arr[i], ds[cnt++].second = ;
}
sort(ds, ds + cnt); int p, c;
for(int id = ; id < cnt; ) {
p = ds[id].first;
LL P = ;
for(int i = id; (id < cnt && ds[i].first == ds[id].first) ? (true) : (id = i, false); i++) {
c = ds[i].second;
P = (P * getSum(p, c)) % moder;
}
P = ((P * (p - ) + ) % moder) * inv(p, moder) % moder;
res = (res * P) % moder;
}
printf(Auto, res);
} int main() {
Euler();
init();
solve();
return ;
}

bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法的更多相关文章

  1. bzoj 3309 DZY Loves Math——反演+线性筛

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...

  2. 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

    3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description ...

  3. 【BZOJ3309】DZY Loves Math(线性筛)

    题目: BZOJ 3309 分析: 首先,经过一番非常套路的莫比乌斯反演(实在懒得写了),我们得到: \[\sum_{T=1}^n \sum_{d|T}f(d)\mu(\frac{T}{d})\lfl ...

  4. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  5. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

  6. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  7. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  8. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

  9. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

随机推荐

  1. RabbitMq入门详解

    因为项目中需要用到RabbitMq,所有花时间研究了下,虽然博客园已经有前辈写了关于RabbitMq的文章.但还是有必要研究下! 什么是RabbitMq? 百度解释:MQ全称为Message Queu ...

  2. python入门之列表

    1.列表基本格式# list 类 列表li = [1, 2, 3, "sb", ["时间",[9, 10], "huang"], 6, 7, ...

  3. 了解MQ

    一.了解RocketMQ? rocketMQ是阿里开源的一款十分优秀的消息队列,rocketMQ具有很多其他消息队列不具有的特性,更重要的是rocketMQ是用java开发的学习成本较低,并且经历了双 ...

  4. jdbc连接oracle时使用的字符串格式

    两种方式: SID的方式: jdbc:oracle:thin:@[HOST][:PORT]:SID SERVICE_NAME的方式: jdbc:oracle:thin:@//[HOST][:PORT] ...

  5. centos python2升级为python3 升级旧版本django

    阿里云centos python3 及django的配置 安装python3后 pip 会把下载的包安入python2.7 下面解决该问题 python3.5安装1,安装依赖包#yum install ...

  6. meta 跳转

    强无敌. 是否厌倦了页面枯燥的跳转? 试试这样的跳转吧. Duration:表示滤镜特效的持续时间(单位:秒) Transition:滤镜类型.表示使用哪种特效,取值为0-23. <Meta h ...

  7. html5-css渐变应用小实例,按钮

    .but1{    padding: 10px 20px;    font-size: 16px;    text-shadow: 2px 2px 3px rgba(0,0,0,0.8);    bo ...

  8. Big Event in HDU (母函数, 玄学AC)

    Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don't k ...

  9. [博客迁移]探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据

    上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...

  10. sql privot 实现行转列

    表结构如下: RefID    HRMS    Name    InsuranceMoney    InsuranceNamefb2bdee8-e4c9-4470-8e7f-14550d3212f7  ...