Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 509  Solved: 284
[Submit][Status][Discuss]

Description

给定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组数据。

Source

 
还是喜欢数论题hhhh,至少不用想那么久。。。。
首先φ是积性函数,这就提示我们可以质因数分解。
我们只要把这个函数在每个质因子下的答案算出来然后都乘起来就行了。
于是现在的问题就变成了当a[1],a[2],,,,a[n]在质数p上的次数分别为 b[1],b[2],,,,b[n]时我们如何求出答案。
 
我一开始想了个比较zz的做法,暴力大背包,,,,dp[i]表示指数和为i的有多少种方法凑到,然后这个质因子的答案
就是1+dp[1]*(p-1)+dp[2]*p*(p-1).......
 
虽然我毒奶一口随机数据的话这个肯定是能过的,,,,然而出题人不可能这么良心的。。。。
一旦有某个质因子在所有数中出现的次数和很大很大那么我这个算法就gg了。。。
 
只能另寻方法。。。
 
最初始的计算某个质因子下答案的式子是:ans=∑φ(p^(c[1]+c[2]+...c[n]))   ,其中0<=c[i]<=b[i]。
然后发现这个也是可以像分解质因数一样合成括号的。
上式=1+ [(p-1)/p]*(π(1+p+p^2+,,,+p^b[i])-1)
 
注意只有当x==0时p^x不用乘(p-1)/p得到φ(p^x)。
 
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define maxm 10000000
#define ha 1000000007
#define pb push_back
using namespace std;
vector<int> g[maxn*];
//g[i]存第i个出现的质因子的指数集合
int cnt=,n,m,dy[maxm+];
int ans=,now,mx[maxn*];
int mul[maxn]; inline int ksm(int x,int y){
int an=;
for(;y;y>>=,x=x*(ll)x%ha) if(y&) an=an*(ll)x%ha;
return an;
} inline void dvd(){
//质因数分解预处理出每个质因子有的指数集合
//dy[i]表示i这个质因子是第几个出现的
m=sqrt(now+0.5);
int c;
for(int i=;i<=m;i++) if(!(now%i)){
c=;
if(!dy[i]) dy[i]=++cnt;
while(!(now%i)) c++,now/=i;
g[dy[i]].pb(c),mx[dy[i]]=max(mx[dy[i]],c); if(now==) break;
} if(now!=){
if(!dy[now]) dy[now]=++cnt;
g[dy[now]].pb(),mx[dy[now]]=max(mx[dy[now]],);
}
} inline void solve(int x){
int tot=,dig=,pos=dy[x];
mul[]=;
//预处理等比数列前缀和
for(int i=;i<=mx[pos];i++){
dig=dig*(ll)x%ha;
mul[i]=mul[i-]+dig;
if(mul[i]>=ha) mul[i]-=ha;
} for(int i=g[pos].size()-;i>=;i--){
tot=tot*(ll)mul[g[pos][i]]%ha;
}
tot--;
if(tot<) tot+=ha;
tot=tot*(ll)(x-)%ha*(ll)ksm(x,ha-)%ha;
tot++; ans=ans*(ll)tot%ha;
} int main(){
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout); scanf("%d",&n);
while(n--){
scanf("%d",&now);
dvd();
} for(int i=;i<=maxm;i++) if(dy[i]) solve(i); printf("%d\n",ans);
return ;
}
 
 

bzoj DZY Loves Math V的更多相关文章

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

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

  2. [BZOJ] DZY Loves Math 系列 I && II

    为了让自己看起来有点事干 ,做个套题吧..不然老是东翻翻西翻翻也不知道在干嘛... \(\bf 3309: DZY \ Loves \ Math\) 令 \(h=f*\mu\) 很明显题目要求的就是\ ...

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

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

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

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

  5. BZOJ3560 : DZY Loves Math V

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

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

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

  7. BZOJ DZY Loves Math系列

    ⑤(BZOJ 3560) $\Sigma_{i_1|a_1}\Sigma_{i_2|a_2}\Sigma_{i_3|a_3}\Sigma_{i_4|a_4}...\Sigma_{i_n|a_n}\ph ...

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

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

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

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

随机推荐

  1. [洛谷P2016] 战略游戏 (树形dp)

    战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...

  2. nginx 静态文件支持跨域访问权限

    一.原生态 location ^~ /repurchase-web/ {          alias /var/www/webapps/repurchase-web/;        } 二.支持跨 ...

  3. Boke光纤交换机的snmp配置

    今天我配置了一下Boke光纤交换机e-300的snmp trap的配置 敲击help命令你会发现配置snmp的命令共有四个 snmpconfig                      Config ...

  4. 请把<ul><li>第1行</li><li>第2行</li>...</ul>(ul之间有10个li元素)插入body里面,注意:需要考虑到性能问题。

    var html = [],i;for(i = 0; i < 10; i++){ html.push('<ul><li>第' + (i+1) + '行</li> ...

  5. C# 序列化理解 1(转)

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方.    .NET框架提供了两种串行化的方式: ...

  6. 好几次的CSS存档

    第一次: #site_nav_under { display: none; } .c_ad_block, .ad_text_commentbox { display: none; margin:; p ...

  7. [POJ1082&POJ2348&POJ1067&POJ2505&POJ1960]简单博弈题总结

    鉴于时间紧张...虽然知道博弈是个大课题但是花一个上午时间已经极限了... 希望省选过后再回过头来好好总结一遍吧. 接下来为了看着顺眼一点...还是按照难度顺序吧   POJ1082 一道最简单的博弈 ...

  8. NT式驱动和WDM式驱动

    刚开始学习驱动,没什么基础,对于好多名词也不是很理解,感觉每天学的驱动都不一样.......今天看了书之后才知道,原来驱动分为NT式驱动和WDM式驱动两种.大概总结一下它们之间的区别. 对于NT式驱动 ...

  9. 编辑器KindEditor的使用

    1.具体使用方法看点这里 2.下载点这里 3.文件夹说明 ├── asp asp示例,删掉 ├── asp.net asp.net示例,删掉 ├── attached 空文件夹,放置关联文件attac ...

  10. 【FIRST USE】第一次用git把代码上传到github

    第一次使用某个东西总是充满了伤痛,我第一次用sed的时候,毁掉了我的所有源代码,第一次用git的时候一直提示不正确,后来解决了问题,便记录下来. 首先说明我的环境,我用的是虚拟机,上面运行的64位的c ...