给定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. cocos2d-x 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  2. WebService/WCF/WebAPI 之间的区别

    Web Service 1.数据的格式基于SOAP协议 2.数据的传输只支持HTTP协议 3.它只能部署在IIS上 WCF 1.数据的格式基于SOAP协议 2.数据的传输支持HTTP,HTTPS,TC ...

  3. 网络编程之Socket的TCP协议实现客户端与客户端之间的通信

    我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...

  4. 测试一体机ASM failgroup的相关问题处理

    环境:3台虚拟机 RHEL 7.3 + Oracle RAC 11.2.0.4 问题现象:RAC运行正常,ASM磁盘组Normal冗余,有failgroup整体故障,有failgroup配置错误. 温 ...

  5. json_decode 转数组

    json_decode($json); 直接转义json数据后会发现转义后的数据时对象类型, 想要获得数组型,加一个参数 json_decode($json,true);

  6. 从caffemodel里面导出参数

    参见博文https://blog.csdn.net/u014510375/article/details/51704447

  7. Discuz!代码大全

    1.[ u]文字:在文字的位置可以任意加入您需要的字符,显示为下划线效果. 2.[ align=center]文字:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left ...

  8. 转自大神的KM想法

    我第一次理解KM算法看到大神的讲解不胜感激这km挺神奇的接下来就见识一下这个大牛的吧 转自 http://blog.csdn.net/wuxinxiaohuangdou/article/details ...

  9. 解读NoSQL数据库的四大家族

    在目前的企业IT架构中,系统管理员以及DBA都会考虑使用NoSQL数据库来解决RDBMS所不能解决的问题,特别是互联网行业.传统的关系型数据库主要以表(table)的形式来存储数据,而无法应对非结构化 ...

  10. 使用SpringAOP获取一次请求流经方法的调用次数和调用耗时

    引语 作为工程师,不能仅仅满足于实现了现有的功能逻辑,还必须深入认识系统.一次请求,流经了哪些方法,执行了多少次DB操作,访问了多少次文件操作,调用多少次API操作,总共有多少次IO操作,多少CPU操 ...