bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法
给定n个正整数a1,a2,…,an,求
的值(答案模10^9+7)。
Input
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 - 线性筛 - 扩展欧几里得算法的更多相关文章
- bzoj 3309 DZY Loves Math——反演+线性筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然 ...
- 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)
3560: DZY Loves Math V Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 241 Solved: 133 Description ...
- 【BZOJ3309】DZY Loves Math(线性筛)
题目: BZOJ 3309 分析: 首先,经过一番非常套路的莫比乌斯反演(实在懒得写了),我们得到: \[\sum_{T=1}^n \sum_{d|T}f(d)\mu(\frac{T}{d})\lfl ...
- ●BZOJ 3309 DZY Loves Math
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...
- 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 ...
- 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较小 ...
- BZOJ 3309: DZY Loves Math
3309: DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 761 Solved: 401[Submit][Status ...
- bzoj 3309 DZY Loves Math 莫比乌斯反演
DZY Loves Math Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1303 Solved: 819[Submit][Status][Dis ...
- bzoj 3462: DZY Loves Math II
3462: DZY Loves Math II Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 211 Solved: 103[Submit][Sta ...
随机推荐
- reveal破解
~/Library/Preferences/com.ittybittyapps.Reveal.plist 把IBAApplicationPersistenceData这一项删除就是了.”
- 阿里云esc服务器上部署java项目
文章中使用centos(6和7版本).Xshell.Xftp 因为部署过程直接从操作服务器开始,如果你还没有连接好服务器请参考http://blog.csdn.net/ctrlxv/article/d ...
- MyBatis基础入门《十二》删除数据 - @Param参数
MyBatis基础入门<十二>删除数据 - @Param参数 描述: 删除数据,这里使用了@Param这个注解,其实在代码中,不使用这个注解也可以的.只是为了学习这个@Param注解,为此 ...
- NHibernate初学者指南系列文章导航
NHibernate初学者指南系列文章导航 前面的话 经过三个多周的时间,终于将这个系列完成了,谢谢大家的关注和支持,有很多不足之处还望大家包涵. 本系列参考的书籍为NHibernate 3 Be ...
- github上删除一个项目或者reposity
1,点击github的头像,选择如下操作. 2.选择要删除的reposity 3.选择settings 4.复制reposity名字,然后下滑鼠标到底部,选择delete this reposity ...
- linux命令-查找所有文件中包含某个字符串
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...
- Yii2开发小技巧
工作中或多或少会用到的关于 Yii2 的小技巧的一个总结,包括model.controller.view或者配置文件的一些写法. 模型相关 获取查询SQL $query = User::find()- ...
- JavaScript--将秒数换算成时分秒
getTime() 返回距 1970 年 1 月 1 日之间的毫秒数 new Date(dateString) 定义 Date 对象的一种方式 <!DOCTYPE html> <h ...
- python urlopen
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. urlopen返回 一个类文件对象(fd),它提供了如下方法:read() , re ...
- JDK8的新特性