【BZOJ3512】DZY Loves Math IV(杜教筛)

题面

BZOJ

\[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)
\]

其中\(n\le 10^5,m\le 10^9\)。

题解

这个数据范围很有意思。

\(n\)的值足够小,所以我们可以直接暴力枚举\(n\)。

那么所求:

\[S(n,m)=\sum_{i=1}^m\varphi(ni)
\]

考虑如何将\(\varphi\)给拆开,因为\(\varphi\)只有每个质因子第一次出现的时候才会特殊计算,其他时候都直接乘起来,因此,假设\(\displaystyle n=\prod p_i^{a_i}\),那么令\(\displaystyle p=\prod p_i^{a_i-1}\),\(\displaystyle q=\prod p_i\),\(pq=n\)

所以有:

\[\begin{aligned}
S(n,m)&=p\sum_{i=1}^m\varphi(qi)\\
&=p\sum_{i=1}^m \varphi(q)\varphi(\frac{i}{gcd(i,q)})gcd(i,q)\\
&=p\sum_{i=1}^m \varphi(\frac{q}{gcd(i,q)})\varphi(i)gcd(i,q)\\
&=p\sum_{i=1}^m \varphi(\frac{q}{gcd(i,q)})\varphi(i)\sum_{d|gcd(i,q)}\varphi(d)\\
&=p\sum_{i=1}^m \varphi(i)\sum_{d|i,d|q}\varphi(\frac{q}{d})\\
&=p\sum_{d|q}\varphi(\frac{q}{d})\sum_{i=1}^{m/d} \varphi(id)\\
&=p\sum_{d|q}\varphi(\frac{q}{d})S(d,[\frac{m}{d}])\\
\end{aligned}\]

那么就可以递归处理啦?

至于复杂度?不会证啦QwQ。

#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
#define MOD 1000000007
#define MAX 2000000
int n,m,ans;
int pri[MAX],tot,phi[MAX],mn[MAX];
bool zs[MAX];
void pre(int n)
{
phi[1]=1;
for(int i=2;i<=n;++i)
{
if(!zs[i])pri[++tot]=i,phi[i]=i-1,mn[i]=i;
for(int j=1;i*pri[j]<=n&&j<=tot;++j)
{
zs[i*pri[j]]=true;mn[i*pri[j]]=pri[j];
if(i%pri[j])phi[i*pri[j]]=phi[i]*phi[pri[j]];
else{phi[i*pri[j]]=phi[i]*pri[j];break;}
}
}
for(int i=1;i<=n;++i)phi[i]=(phi[i-1]+phi[i])%MOD;
}
map<int,int> M,S[100010];
int Phi(int n)
{
if(n<MAX)return phi[n];
if(M[n])return M[n];
int ret=1ll*n*(n+1)/2%MOD;
for(int i=2,j;i<=n;i=j+1)
{
j=n/(n/i);
ret=(ret+MOD-1ll*(j-i+1)*Phi(n/i)%MOD)%MOD;
}
return M[n]=ret;
}
int Solve(int n,int m)
{
if(!m)return 0;
if(n==1)return Phi(m);
if(m==1)return (Phi(n)-Phi(n-1)+MOD)%MOD;
if(S[n][m])return S[n][m];
int ret=0;
vector<int> fac;int p=1,q=1,N=n;
while(N>1)
{
int x=mn[N];q*=x;N/=x;fac.push_back(x);
while(N%x==0)p*=x,N/=x;
}
for(int i=0,l=fac.size();i<1<<l;++i)
{
int d=1;
for(int j=0;j<l;++j)if(i&(1<<j))d*=fac[j];
ret=(ret+1ll*(Phi(q/d)-Phi(q/d-1)+MOD)*Solve(d,m/d))%MOD;
}
return S[n][m]=1ll*ret*p%MOD;
}
int main()
{
scanf("%d%d",&n,&m);pre(MAX);
for(int i=1;i<=n;++i)ans=(ans+Solve(i,m))%MOD;
printf("%d\n",ans);
return 0;
}

【BZOJ3512】DZY Loves Math IV(杜教筛)的更多相关文章

  1. 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较小 ...

  2. 【bzoj3512】DZY Loves Math IV 杜教筛+记忆化搜索+欧拉函数

    Description 给定n,m,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)\)模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅 ...

  3. BZOJ3512 DZY Loves Math IV(杜教筛+线性筛)

    注意到n很小,考虑枚举i.现在要求的是f(n,m)=Σφ(in) (i=1~m).显然当n没有平方因子时,φ(in)=φ(i)·φ(n/gcd(i,n))·gcd(i,n).利用φ*1=id又可得φ( ...

  4. BZOJ3512 DZY Loves Math IV

    解:这又是什么神仙毒瘤题...... 我直接把后面那个phi用phi * I = id反演一波,得到个式子,然后推不动了...... 实际上第一步我就大错特错了.考虑到n很小,我们有 然后计算S,我们 ...

  5. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】

    参考:http://blog.csdn.net/wzf_2000/article/details/54630931 有这样一个显然的结论:当\( |\mu(n)|==1 \)时,\( \phi(nk) ...

  6. 【BZOJ3309】DZY Loves Math 莫比乌斯反演+线性筛(好题)

    [BZOJ3309]DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10 ...

  7. ●BZOJ 3512 DZY Loves Math IV

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3512 题解: $$求ANS=\sum_{i=1}^{N}\sum_{j=1}^{M}\phi ...

  8. 【刷题】BZOJ 3512 DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Input 仅一行,两个整数n,m. Output 仅一行答案. Sample Input 100000 1000000000 Sampl ...

  9. bzoj 3512: DZY Loves Math IV

    Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1} ...

随机推荐

  1. Luogu P3959 宝藏

    这道题正解是状压DP,不过我不会所以写一下随机化算法来骗骗分. 听说当时考场上就有很多写prim然后挂掉的神仙,其实这道题是可以prim过的 prim是一种基于贪心的算法,在本题中由于盲目的选择当前最 ...

  2. 【noi.ac】#309. Mas的童年

    #309. Mas的童年 链接 分析: 求$max \{sj + (s_i \oplus s_j)\}$ 因为$a + b = a \oplus b + (a \& b) \times 2$ ...

  3. rabbitMq与spring boot搭配实现监听

    在我前面有一篇博客说到了rabbitMq实现与zk类似的watch功能,但是那一篇博客没有代码实例,后面自己补了一个demo,便于理解.demo中主要利用spring boot的配置方式, 一.消费者 ...

  4. HDOJ2013_蟠桃记

    水题 HDOJ2013_蟠桃记 #include<stdio.h> #include<stdlib.h> #include<math.h> #include< ...

  5. python 生成器、列表解析式、yield、迭代器

    开局一张图总结关系 一.列表解析式 我们习惯生成列表通过list = [1, 2, 3]的方式.还有一种很方便的列表生成方式 list = [a*2 for a in range(10)],或者lis ...

  6. varnish页面缓存服务

    varnish页面缓存服务 https://www.cnblogs.com/L-dongf/p/9310144.html http://blog.51cto.com/xinzong/1782669 阅 ...

  7. 伪静态与重定向--RewriteBase

    RewriteBase用于设置目录级重写的基准URL,即所有的重定向都是基于这个URL.内部重定向可能看不出效果,但是在外部重定向(使用R flag后),如果不手动指定 / 为根目录,那么就会去整个磁 ...

  8. Vim列模式(块选择)输入

    https://www.ibm.com/developerworks/cn/linux/l-cn-vimcolumn/ https://www.zhihu.com/question/19968224 ...

  9. jmeter 使用csv文件 注意项

    1.首先在jmeter 中导入csv文件时我们程序并不知道csv文件中有多少行 : >1.获取的时候 使用 循环控制器来获取csv文件中的所有数据 : 通过 ${__jexl3("${ ...

  10. Oracle数据库SQLPLUS 连接显示 ??? 的解决

    linux下 安装了中文版本的,造成sqlplus 连接时出现了乱码 如图 一开始以为是LANG 变量的问题 后来发现是NLS_LANG的问题 解决方法: export NLS_LANG=" ...