【BZOJ3960】DZY Loves Math V(数论)
题目:
分析:
orz跳瓜。
欧拉函数的公式:
\]
其中 \(p_i\) 取遍 \(n\) 的所有质因子。
考虑原式,把欧拉函数展开,得到:
\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}\) ,则答案为:
\]
其中 \(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\) )。
上面的式子相当于(括号比较鬼畜,凑合看吧……):
\]
(即直接减去不合法的 \(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(数论)的更多相关文章
- BZOJ3560 DZY Loves Math V 数论 快速幂
原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ...
- 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)
3560: DZY Loves Math V Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 241 Solved: 133 Description ...
- BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ...
- BZOJ3560 : DZY Loves Math V
因为欧拉函数是非完全积性函数,所以可以考虑对每个数进行分解质因数,将每个质数的解乘起来即可. 对于一个质数$p$,设它在各个数中分别出现了$b_1,b_2,...b_n$次,那么由生成函数和欧拉函数的 ...
- BZOJ3560 DZY Loves Math V(欧拉函数)
对每个质因子分开计算再乘起来.使用类似生成函数的做法就很容易统计了. #include<iostream> #include<cstdio> #include<cmath ...
- bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法
给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...
- [BZOJ3560]DZY Loves Math V(欧拉函数)
https://www.cnblogs.com/zwfymqz/p/9332753.html 由于欧拉函数是积性函数,可以用乘法分配律变成对每个质因子分开算最后乘起来.再由欧拉函数公式和分配律发现就是 ...
- 【bzoj3560】DZY Loves Math V 欧拉函数
题目描述 给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). 输入 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. 输出 仅一行答案. 样例输入 3 ...
- bzoj DZY Loves Math V
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 509 Solved: 284[Submit][Status][Discuss] Descriptio ...
随机推荐
- 00 大王警语--be_a_new_gentleman
大王博客:https://www.cnblogs.com/alex3714/ # 表面层次# 1,着装特体(服饰的牌子中高端)# 2,每天洗澡# 3,适当用香水# 4,女士优先# 5,不随地吐痰.不乱 ...
- linux 简单实用小操作
mysql改密码 通过root以后,(root密码忘记就没法了) alter user username@'%' identified by 'password' 端口被占用 sudo fuser - ...
- Cisco IOU Web Interface : Web IOU
https://github.com/dainok http://sns.clnchina.com.cn/space.php?uid=404779&do=blog&id=4298 ht ...
- VMware 9 安装 Mac OS X 10.8 Mountain Lion 图文全程
http://unmi.cc/vmware9-install-mac-os-x-mountain-lion 非常详细,赞一下 本教程是在 VMware 9 下安装当前最新版的 Mac OS X Mou ...
- C++ - 模板函数须要类型转换时使用友元(friend)模板函数
模板函数须要类型转换时使用友元(friend)模板函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24357301 非模板函数 ...
- 【oracle11g,18】存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表
一. 暂时表 暂时表放在暂时表空间,不生成redo,仅仅有undo. 在暂时表中能够创建索引.视图及触发器,还能够使用"Export and Import(导出和导入)"或&quo ...
- C++对象模型——Template中的名称决议方式 (第七章)
Template中的名称决议方式 (Name Resolution within a Template) 必须可以区分下面两种意义,一种是C++ Standard所谓的"sope of th ...
- ERROR (ConnectionError): HTTPConnectionPool (Caused by <class 'socket.error'>: [Errno 111] Connecti
感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免.欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- WPF学习笔记:获取ListBox的选中项
有代码有J8: UI <UserControl x:Class="UnitViews.UserListUV" xmlns="http://schemas.micro ...
- poj2011
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17608 Accepted: 765 ...