Description

给定n,m,求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\varphi(ij)\)模10^9+7的值。

Input

仅一行,两个整数n,m。

Output

仅一行答案。

Sample Input

100000 1000000000

Sample Output

857275582

数据规模

1<=n<=105,1<=m<=109。

sol

%%%ranwen!!!

前置技能:

  1. \(n=\sum_{d|n}\varphi(d)\)
  2. \(\varphi(ij)=\varphi(\frac{i}{d})*\varphi(j)*d\quad[d=(i,j)]\)
  3. \([\mu(x)=1||-1]\quad\varphi(\frac{x}{d})*\varphi(\frac{d}{e})=\varphi(\frac{x}{e})\quad[e|d]\)

证明:1不多说,2的意思就是让ij互质然后直接分解成两个phi,接着把gcd产生的倍数贡献乘回去,3因为x没有平方因子。除以d之后就不会有d 的因子了,所以与\(\frac{d}{e}\)互质,满足积性函数性质,乘起来即可。

解法:

首先观察数据范围可知,n的范围较小,可以进行枚举,而m的范围极大,已经超过了线性筛的范围。

我们考虑枚举i,然后推一波式子:

设\(s(n,m)=\sum_{i=1}^{m}\varphi(ni)\)

设w是n所有质因子一次方的乘积,v=n/w,则:

\(s(n,m)=v*\sum_{i=1}^{m}\varphi(iw)\)

设\(d=(i,w)\),然后用公式2得:

\(s(n,m)=v*\sum_{i=1}^{m}\varphi(i)*\varphi(\frac{w}{d})*d\)

用公式1,得:

\(s(n,m)=v*\sum_{i=1}^{m}\varphi(i)*\varphi(\frac{w}{d})*\sum_{e|d}\varphi(\frac{d}{e})\)

用公式3,得:

\(s(n,m)=v*\sum_{i=1}^{m}\varphi(i)*\sum_{e|i,e|w}\varphi(\frac{w}{e})\)

因为 \(d=(i,w)\),所以:

\(s(n,m)=v*\sum_{e|w}\varphi(\frac{w}{e})*\sum_{i=1}^{\lfloor\frac{m}{e}\rfloor}\varphi(ie)\)

根据\(s(n,m)\)的定义得:

\(s(n,m)=v*\sum_{e|w}\varphi(\frac{w}{e})*s(e,\frac{m}{e})\)

当n等于1的时候,可以直接使用杜教筛计算。

直接记忆化搜索即可。

因为每一步的m都是\(\lfloor\frac{x}{y}\rfloor\)的形式,所以可以使用下底分块法来计算。

时间复杂度\(O(n\sqrt{m}+n^{\frac{2}{3}})\)。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,tot,ans,phi[1000005],sum[1000005],pri[1000005],low[1000005],vis[1000005],P=1e9+7;
map<pair<int,int>,int>a;map<int,int>b;
int djs(int x)
{
if(x<=1e6) return sum[x];
if(b.count(x)) return b[x];
int tp=1ll*x*(x+1)/2%P,last;
for(int i=2;i<=x;i=last+1) last=x/(x/i),tp=(tp-1ll*(last-i+1)*djs(x/i)%P+P)%P;
b.insert(make_pair(x,tp));return tp;
}
int solve(int x,int y)
{
if(!x||!y) return 0;
if(x==1) return djs(y);
if(y==1) return phi[x];
if(a.count(make_pair(x,y))) return a[make_pair(x,y)];
int w=low[x],v=x/w,lim=floor(sqrt(w)+0.1),tp=0;
for(int i=1;i<=lim;i++) if(w%i==0)
{
tp=(tp+1ll*phi[w/i]*solve(i,y/i)%P)%P;
if(i!=w/i) i=w/i,tp=(tp+1ll*phi[w/i]*solve(i,y/i)%P)%P,i=w/i;
}
tp=1ll*tp*v%P;a.insert(make_pair(make_pair(x,y),tp));
return tp;
}
int main()
{
phi[1]=low[1]=sum[1]=1;
for(int i=2;i<=1000000;sum[i]=(sum[i-1]+phi[i])%P,i++)
{
if(!vis[i]){pri[++tot]=i;phi[i]=i-1;low[i]=i;}
for(int j=1;j<=tot&&i*pri[j]<=1000000;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];low[i*pri[j]]=low[i];break;}
phi[i*pri[j]]=phi[i]*(pri[j]-1),low[i*pri[j]]=low[i]*pri[j];
}
}
scanf("%d%d",&n,&m);
if(n>m) swap(n,m);
for(int i=1;i<=n;i++) ans=(ans+solve(i,m))%P;
printf("%d\n",ans);
}

【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(杜教筛+线性筛)

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

  3. BZOJ3512 DZY Loves Math IV

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

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

    [BZOJ3512]DZY Loves Math IV(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\] 其中\(n\le 10^5,m\l ...

  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. 【问题】/usr/bin/env: php: 没有那个文件或目录

    php不是默认安装的,在使用symfony创建新项目时,出现这个提示. [root@localhost html]# symfony demo /usr/bin/env: php: 没有那个文件或目录 ...

  2. web界面上的字体兼容方案

    原贴地址:http://www.baidufe.com/item/60cd11d3bfdee5c51369.html 做前端的,对web界面基本都抠的很仔细,尤其精确到1px! 类似边距.宽度.高度等 ...

  3. Django模板语言之组合搜索

    url.py from django.conf.urls import url from django.contrib import admin from app01 import views url ...

  4. 优化tomcat配置(从内存、并发、缓存3个方面)优化

    Tomcat有很多方面,我从内存.并发.缓存三个方面介绍优化方法. 一.Tomcat内存优化 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catal ...

  5. wampserver无法打开http://127.0.0.1/

    如果你更换了端口号那么你就应该把相应的端口号也带上,比如localhost:8080(或127.0.0.1:8080)这样应该就可以了,因为只有80端口是默认才不用输入的.

  6. algorithm notes

    1.算法可视化 https://visualgo.net/en

  7. Yii2邮箱发送与配置

    1配置邮箱 在 common/config/web.php中写入以下代码配置 Mail代理 return [ 'components' => [ ...//your code, //以下是 ma ...

  8. Ajax——jQuery实现

    紧接上文 一.load()方法 load() 方法师jQuery中最为简单和常用的Ajax方法,能载入远程的HTML代码并插入到DOM中.它的机构是:load(url[,data][,callback ...

  9. 7. Smali基础语法总结

    最近在学习Android 移动安全逆向方面,逆向首先要看懂代码,Android4.4之前一直使用的是 Dalivk虚拟机,而Smali是用于Dalivk的反汇编程序的实现. Smali 支持注解,调试 ...

  10. 金融卡IC卡知识50问

    1.什么是金融IC卡? 金融IC卡又称为芯片银行卡,是以芯片作为介质的银行卡.芯片卡容量大,可以存储密钥.数字证书.指纹等信息,其工作原理类似于微型计算机,能够同时处理多种功能,为持卡人提供一卡多用的 ...