题目:

BZOJ3560

分析:

orz跳瓜。

欧拉函数的公式:

\[\phi(n)=n(\prod \frac{p_i-1}{p_i})
\]

其中 \(p_i\) 取遍 \(n\) 的所有质因子。

考虑原式,把欧拉函数展开,得到:

\[\sum_{b_1|a_1}\sum_{b_2|a_2}\cdots\sum_{b_n|a_n}\prod b_i \prod \frac{(p_j-1)}{p_j}=
\sum_{b_1|a_1}\sum_{b_2|a_2}\cdots\sum_{b_n|a_n}\prod p_j^{a_j}\frac{(p_j-1)}{p_j}\]

其中 \(p_j\) 取遍 \(\prod b_i\) 的所有质因子, \(\prod p_j^{a_j}=\prod b_i\)。

可以看出,对于每个质数 \(p\) ,它的贡献是独立的。设 \(a_j\) 中 \(p_i\) 的次数为 \(c_{ij}\) ,则答案为:

\[\prod_i \left(1+\frac{p_i-1}{p_i}\prod_{j=1}^n \sum_{k_j=0}^{c_{ij}}\left[\sum k_j>0\right]p_i^{\sum k_j}\right)
\]

其中 \(k_j\) 表示在第 \(j\) 个数中取了 \(p_i\) 的 \(k_j\) 次幂。当 \(\sum k_j=0\) (即 \(\prod b_i\) 不含质因子 \(p_i\) )时不乘 \(\frac{p_i-1}{p_i}\) ,这种情况中 \(p_i\) 对答案的贡献是乘 \(1\) (即最前面加的 \(1\) )。

上面的式子相当于(括号比较鬼畜,凑合看吧……):

\[\prod_i \left(1+\frac{p_i-1}{p_i}\left(\left(\prod_{j=1}^n \sum_{k_j=0}^{c_{ij}}p_i^{\sum k_j}\right)-1\right)\right)
\]

(即直接减去不合法的 \(p_i^{\sum k_j}=p_i^0=1\) )

然后可以暴力算。对于每一个质数预处理出它的幂的前缀和,并可以只枚举有质因子 \(p_i\) 的 \(a_j\) 。由于每个数的质因子种类数最多 \(10\) 个左右,所以总复杂度大约 \(O(10n)\),可以过。具体实现详见代码。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std; namespace zyt
{
template<typename T>
inline bool read(T &x)
{
char c;
bool f = false;
x = 0;
do
c = getchar();
while (c != EOF && c != '-' && !isdigit(c));
if (c == EOF)
return false;
if (c == '-')
f = true, c = getchar();
do
x = x * 10 + c - '0', c = getchar();
while (isdigit(c));
if (f)
x = -x;
return true;
}
template<typename T>
inline void write(T x)
{
static char buf[20];
char *pos = buf;
do
*pos++ = x % 10 + '0';
while (x /= 10);
while (pos > buf)
putchar(*--pos);
}
typedef long long ll;
const int N = 1e5 + 10, MX = 1e6 + 10, B = 30, mod = 1e9 + 7;
int n, cnt, pow[B];
pair<int, int> prime[MX];
void get_prime(int a)
{
for (int i = 2; (ll)i * i <= a; i++)
if (a % i == 0)
{
prime[cnt++] = make_pair(i, 0);
while (a % i == 0)
++prime[cnt - 1].second, a /= i;
}
if (a > 1)
prime[cnt++] = make_pair(a, 1);
}
inline int power(int a, int b)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = (ll)ans * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return ans;
}
inline int inv(const int a)
{
return power(a, mod - 2);
}
int cal(const int l, const int r)
{
int p = prime[l].first;
int ans = 1, mx = 0;
for (int i = l; i <= r; i++)
mx = max(mx, prime[i].second);
pow[0] = 1;
for (int i = 1; i <= mx; i++)
pow[i] = (ll)pow[i - 1] * p % mod;
for (int i = 1; i <= mx; i++)
pow[i] = (pow[i] + pow[i - 1]) % mod;
for (int i = l; i <= r; i++)
ans = (ll)ans * pow[prime[i].second] % mod;
ans = (ans - 1 + mod) % mod;
ans = (ll)ans * (p - 1) % mod * inv(p) % mod;
return (ans + 1) % mod;
}
int work()
{
int n;
read(n);
for (int i = 0; i < n; i++)
{
int a;
read(a);
get_prime(a);
}
sort(prime, prime + cnt);
int pre = 0, ans = 1;
for (int i = 0; i < cnt; i++)
if (prime[i].first != prime[i + 1].first)
ans = (ll)ans * cal(pre, i) % mod, pre = i + 1;
write(ans);
return 0;
}
}
int main()
{
return zyt::work();
}

【BZOJ3960】DZY Loves Math V(数论)的更多相关文章

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

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

  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. BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演

    原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...

  4. BZOJ3560 : DZY Loves Math V

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

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

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

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

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

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

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

  8. 【bzoj3560】DZY Loves Math V 欧拉函数

    题目描述 给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). 输入 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. 输出 仅一行答案. 样例输入 3 ...

  9. bzoj DZY Loves Math V

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

随机推荐

  1. react----父子组件之间的参数传递

    1.父组件向子组件传递参数 //父组件 import React from 'react'; import './header.css' import ComponentChild from './h ...

  2. JavaScript学习总结(12)——2016 年 7 个顶级 JavaScript 框架

    当涉及到Web开发时,JavaScript框架往往是一些开发人员和企业最受欢迎的平台.可能,你有机会尝试过一两个顶级的JavaScript框架,但你仍然有点不确定哪个才是最佳的最值得掌握的,或者哪个值 ...

  3. getContextPath和getRealPath的区别-----其实主要区别就是相对路径和绝对路径

    getContextPath和getRealPath的区别 其实主要区别就是相对路径和绝对路径 https://blog.csdn.net/zsmj_2011/article/details/4121 ...

  4. 印象笔记再WIN10同步失败解决方法

    IE11不支持tls1.1导致印象笔记安全性失效 打开组策略,关闭IE的加密策略就可以同步了

  5. Spring Cloud(4):Feign的使用

    基于上一篇文章:https://www.cnblogs.com/xuyiqing/p/10867739.html 使用Ribbon实现了订单服务调用商品服务的Demo 下面介绍如何使用Feign实现这 ...

  6. RAC fail over 测试

    oracle rac 11gr2中提供了多种 failover方式,这里只测试 server side TAF. 也就是说在server端配置的failover.这种配置方式的好处就是,如果有什么改动 ...

  7. TDSTCPServerTransport 的Filters

    TDSTCPServerTransport 的Filters TDSTCPServerTransport 的 Filter 属性,可以对传递的数据进行加密,压缩,再修改等,有 点注入的概念.默认情况下 ...

  8. apache2 ubuntu18.04 配置虚拟端口

    修改3个文件/etc/apache2/apache2.conf/etc/apache2/ports.conf/etc/apache2/sites-available/000-default.conf ...

  9. GNS3 使用SecureCRT

    "D:\SecureCRT\SecureCRT.EXE" /SCRIPT D:\SecureCRT\DyRouter.vbs /ARG %d /T /TELNET %h %p st ...

  10. IOS--JSON数据解析成字典

    JSON解析成字典 {} –>字典 [] –>数组 ""–>字符串 11/11.1–>NSNumber true/false –>NSNumber n ...