Description

给定n,m,求



模10^9+7的值。

Solution

设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\)

\(Ans=\sum_{i=1}^{n}S(i,m)\)

\(S(n,m)=\sum_{i=1}^{m}\phi(n*i)\)

如果 \(\mu(n)!=0\)

则有 \(\sum_{i=1}^{m}\phi(\frac{n}{gcd(i,n)})*\phi(i)*gcd(i,n)\) (因为要保证除完\(gcd\)之后,两数不含相同的质因子,所以 \(\mu(n)!=0\))

\(\sum_{i=1}^{m}\phi(\frac{n}{gcd(i,n)})*\phi(i)*\sum_{d|i,d|n}\phi(d)\)

因为第一项和第三项是互质的 , 所以可以合并.

\(\sum_{i=1}^{m}\phi(i)*\sum_{d|n,d|i}\phi(\frac{n}{d})\)

\(\sum_{d=1}^{n}\phi(\frac{n}{d})*\sum_{i=1}^{\frac{m}{d}}\phi(d*i)\)

\(\sum_{d=1}^{n}\phi(\frac{n}{d})*S(d,\lfloor\frac{m}{d}\rfloor)\)

递归处理即可

如果 \(\mu(n)=0\)

我们直接提出 \(n\) 的多出的质因子之积 \(a\),使得 \(\mu(\frac{n}{a})!=0\)

那么 \(S(n,m)=\sum_{i=1}^{m}\phi(n*i)\) 中也可以提出 \(a\) 了,因为相同的质因子只会被算一次

根据定义式 \(\phi(n)=n*\Pi p_i\),所以 \(a\) 唯一的贡献就是使前面的 \(n\) 乘了个 \(a\)

\(a*S(n,m)=\sum_{i=1}^{m}\phi(\frac{n}{a}*i)=a*S(\frac{n}{a},m)\)

递归处理即可

边界条件 \(m=1​\) 时,结果为 \(\phi(n)​\), \(n=1​\) 时,跑一个杜教筛就行了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,prime[N],num=0,m,phi[N],mu[N],pre[N],la[N],s[N];bool vis[N];
void priwork(){
phi[1]=s[1]=1;
for(int to,i=2;i<N;i++){
if(!vis[i])prime[++num]=i,phi[i]=i-1,mu[i]=-1,pre[i]=i;
for(int j=1;j<=num && i*prime[j]<N;j++){
vis[to=i*prime[j]]=1;pre[to]=prime[j];
if(i%prime[j])phi[to]=phi[i]*(prime[j]-1),mu[to]=-mu[i];
else {phi[to]=phi[i]*prime[j];break;}
}
s[i]=(s[i-1]+phi[i])%mod;
}
for(int i=2;i<=n;i++){
if(mu[i])continue;
int last=0,x=i;la[i]=1;
while(x>1){
if(pre[x]==last)la[i]*=pre[x];
last=pre[x];x/=pre[x];
}
}
}
map<int,int>S[N],T;
inline int calc(int n){
if(n<N)return s[n];
if(T.find(n)!=T.end())return T[n];
int ret=(1ll*n*(n+1)>>1)%mod;
for(int i=2,r;i<=n;i=r+1){
r=n/(n/i);
ret=(ret-1ll*calc(n/i)*(r-i+1))%mod;
}
if(ret<0)ret+=mod;
return T[n]=ret;
}
inline int solve(int n,int m){
if(m==1)return phi[n];
if(n==1)return calc(m);
if(S[n].find(m)!=S[n].end())return S[n][m];
if(!mu[n])return 1ll*la[n]*solve(n/la[n],m)%mod;
int ret=0,lim=min(m,(int)sqrt(n));
for(int i=1;i<=lim;i++){
if(n%i==0){
if(i*i!=n)ret=(ret+1ll*phi[n/i]*solve(i,m/i)+1ll*phi[i]*solve(n/i,m/(n/i)))%mod;
else ret=(ret+1ll*phi[n/i]*solve(i,m/i))%mod;
}
}
return S[n][m]=ret;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n>>m;
priwork();
int ans=0;
for(int i=1;i<=n;i++)ans=(ans+solve(i,m))%mod;
printf("%d\n",ans);
return 0;
}

bzoj 3512: 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. ●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 ...

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

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

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

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

  5. 【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 ...

  6. ●BZOJ 3309 DZY Loves Math

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3309 题解: 莫比乌斯反演,线筛 化一化式子: f(x)表示x的质因子分解中的最大幂指数 $ ...

  7. BZOJ 3561 DZY Loves Math VI

    BZOJ 3561 DZY Loves Math VI 求\(\sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j)^{\gcd(i,j)}\),钦定\(n\leq m ...

  8. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  9. bzoj 3309 DZY Loves Math 莫比乌斯反演

    DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1303  Solved: 819[Submit][Status][Dis ...

随机推荐

  1. Spring学习(三)——集成 Velocity

    上篇文章http://www.cnblogs.com/wenjingu/p/3822989.html我们使用Gradle构建了一个简单的Spring MVC Web应用程序, 本篇将在上篇的基础上将j ...

  2. ASP.NET MVC 控制器通过继承控制器来达到 过滤 并且多了一个IAuthenticationFilter

    暂时没有用到过这个IAuthenticationFilter接口,毕竟已经有三个具体实现类了,所以这个还不知道用在哪,以后看看 20190324 需要注意!!!控制器重写方法都是被protected修 ...

  3. C#反射的基本应用

    反射描述了在运行过程中检查和处理程序元素的功能.反射可以完成以下任务: 枚举类型的成员: 实例化新对象: 执行对象的成员: 查找类型的信息: 查询程序集的信息: 检查应用于某种类型的自定义特性: 创建 ...

  4. Redis 工具类

    项目里的Redis 工具类,写下来以备后用 public class RedisConnector { public class RedisParseResult<T> { public ...

  5. Struts2学习第4天--拦截器

    第1章     Struts2_day04笔记 1.1      上次课内容回顾 l  OGNL表达式 n  OGNL的概述 u  OGNL:对象图导航语言,是一门功能强大的表达式语言. n  OGN ...

  6. “全栈2019”Java第二十章:按位与、按位或、异或、反码、位运算

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. [Objective-C语言教程]块(12)

    Objective-C类定义了一个将数据与相关行为相结合的对象. 有时,仅表示单个任务或行为单元而不是方法集合是有意义的. 块是C,Objective-C和C++等编程语言中的高级功能,它允许创建不同 ...

  8. linux开始之旅-01 linux需要知道的这几位

    首先介绍几个人,没有这几个人就没有linux. 第一个:肯·汤普逊(左)和丹尼斯·里奇(右)  ------ C语言之父   ------学计算机的人都应该认识吧,计算机学院楼道里面都会有这两位. 美 ...

  9. [inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行

    [inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行 1.模板解释器 hotspot解释器模块(hotspot\src\share\vm\inter ...

  10. 对路径访问拒绝,要加上具体filename/c.png

    string strPath = Path.Combine(FilePath, DateTime.Now.ToString("yyyy-MM-dd")); if (!Directo ...