题目描述

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

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

输入

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

输出

仅一行答案。

样例输入

3
6
10
15

样例输出

1595


题解

欧拉函数

由于 $\varphi$ 是积性函数,所以可以单独考虑每个质因子的贡献。

那么对于最终的 $a=i_1i_2\dots i_n$ ,若其包含 $p^c\ ,\ c>0$ ,则贡献为 $\frac{p-1}{p}·p^c$ 。因此求出 $p^c$ 的总和,再乘上 $\frac{p-1}{p}$ ,再加上1(都不包含 $p$ 的情况)即可得到 $p$ 的总贡献。

设 $a_j$ 中包含 $p^{c_j}$ ,那么 $p^c$ 的总和就是所有与 $p$ 相关的 $\prod\limits_{j=1}^n\sum\limits_{k=0}^{c_j}p^k$ 减去不含 $p$ 的 $1$ 。

因此最终答案就是 $\prod\limits_{prime(p)}(\frac{p-1}{p}(\prod\limits_{j=1}^n\sum\limits_{k=0}^{c_{p,j}}p^k-1)+1)$ 。

线性筛预处理每个数最小的质因子,对每个数 $O(\log a)$ 分解质因数,复杂度 $O(a+n\log a)$

#include <cstdio>
#define M 10000010
#define mod 1000000007
typedef long long ll;
int pre[M] , prime[M] , tot , val[50] , cnt[50] , top;
ll res[M];
bool np[M];
ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
void init()
{
int n = 10000000 , i , j;
for(i = 1 ; i <= n ; i ++ ) res[i] = 1;
for(i = 2 ; i <= n ; i ++ )
{
if(!np[i]) pre[i] = prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
{
np[i * prime[j]] = 1 , pre[i * prime[j]] = prime[j];
if(i % prime[j] == 0) break;
}
}
}
int main()
{
init();
int n , i , x , now , sum;
ll ans = 1;
scanf("%d" , &n);
while(n -- )
{
scanf("%d" , &x);
top = 0;
for(i = x ; i != 1 ; i /= pre[i])
{
if(pre[i] != val[top]) val[++top] = pre[i];
cnt[top] ++ ;
}
for(i = 1 ; i <= top ; i ++ )
{
now = sum = 1;
while(cnt[i]) cnt[i] -- , now *= val[i] , sum += now;
res[val[i]] = res[val[i]] * sum % mod;
}
}
for(i = 2 ; i <= 10000000 ; i ++ )
if(!np[i] && res[i] != 1)
ans = ans * ((res[i] - 1 + mod) * pow(i , mod - 2) % mod * (i - 1) % mod + 1) % mod;
printf("%lld\n" , ans);
return 0;
}

【bzoj3560】DZY Loves Math V 欧拉函数的更多相关文章

  1. [BZOJ3560]DZY Loves Math V(欧拉函数)

    https://www.cnblogs.com/zwfymqz/p/9332753.html 由于欧拉函数是积性函数,可以用乘法分配律变成对每个质因子分开算最后乘起来.再由欧拉函数公式和分配律发现就是 ...

  2. BZOJ3560 : DZY Loves Math V

    因为欧拉函数是非完全积性函数,所以可以考虑对每个数进行分解质因数,将每个质数的解乘起来即可. 对于一个质数$p$,设它在各个数中分别出现了$b_1,b_2,...b_n$次,那么由生成函数和欧拉函数的 ...

  3. BZOJ3560 DZY Loves Math V(欧拉函数)

    对每个质因子分开计算再乘起来.使用类似生成函数的做法就很容易统计了. #include<iostream> #include<cstdio> #include<cmath ...

  4. BZOJ3560 DZY Loves Math V 数论 快速幂

    原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ...

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

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

  6. 【BZOJ3960】DZY Loves Math V(数论)

    题目: BZOJ3560 分析: orz跳瓜. 欧拉函数的公式: \[\phi(n)=n(\prod \frac{p_i-1}{p_i})\] 其中 \(p_i\) 取遍 \(n\) 的所有质因子. ...

  7. [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树

    链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...

  8. bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法

    给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...

  9. bzoj DZY Loves Math V

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 509  Solved: 284[Submit][Status][Discuss] Descriptio ...

随机推荐

  1. HTTP请求方式:GET和POST的比较

    GET和POST是HTTP的两个常用方法 什么是HTTP? 超文本传输协议(HyperText Transfer Prptocol-HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP ...

  2. idea开启jquery提示及如何找到学习目标

    idea开启jquery提示 根据这些library就知道该学习哪些技术了

  3. 牛客小白月赛9H论如何出一道水题(两个连续自然数互质)

    题面 记录一下...连续得两个自然数互质,这题再特判一下1的情况 #include<bits/stdc++.h> using namespace std; int main() { lon ...

  4. Python之requests的安装

    在 windows 系统下,只需要输入命令 pip install requests ,即可安装. 在 linux 系统下,只需要输入命令 sudo pip install requests ,即可安 ...

  5. 实现短信超链接调起APP

    因APP推广的需求,需要给APP用户定期发送短信提醒登录使用,为了更好的用户体验在短信内容中嵌入了可以直接打开APP的超链接,下面介绍一下具体的代码实现. 编辑openApp.html文件: < ...

  6. 列出连通集(mooc)

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...

  7. 420. Count and Say【LintCode java】

    Description The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, ...

  8. C语言--指针详解

    这段时间在看 Linux 内核,深觉 C 语言功底不扎实,很多代码都看不太懂,深入学习巩固 C 语言的知识很有必要.先从指针开始. 一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字 ...

  9. 3.10-通过requests、BeautifulSoup、webbrowser模块的相关方法,爬取网页数据示例程序(一)

    import requests,bs4res=requests.get('https://www.hao123.com/')print('res对象的类型:',type(res))res.raise_ ...

  10. java-length 、length()、size()的区别

    public static void main(String[] args) { //length .length().size()的区别 //length属性 针对数组长度 String a[]={ ...