【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

仅一行答案。

Sample Input

100000 1000000000

Sample Output

857275582

数据规模

1<=n<=10^5,1<=m<=10^9。

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);
}

原文地址:https://www.cnblogs.com/CK6100LGEV2/p/9389835.html

时间: 2024-10-05 10:48:58

【bzoj3512】DZY Loves Math IV 杜教筛+记忆化搜索+欧拉函数的相关文章

[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 仅一行答案. Sample Input 100000 1000000000 Sample Output 857275582 Solution 神题.. 考虑\(n\)比较小,试着枚举\(n\),处理\(m\). 设\(s(n,m)=\sum_{i=1}^{m}\varphi(ni)\) 那么考

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}^{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\)之后,两数不含

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

题目描述 对于正整数x,定义f(x)为x所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数n,m,求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$ 输入 第一行一个数T,表示询问数.接下来T行,每行两个数n,m,表示一个询问. 输出 对于每一个询问,输出一行一个非负整数作为回答. 样例输入 4 7558588 9653114 6514903 445121

杜教筛之逆运算

前言: 下面介绍的这种方法并不常见,但是非常的有用 准确来说,我是来拓荒的,所以有什么问题请一定指出 前置技能: 积性函数 狄利克雷卷积 一定式子转化能力 其实对杜教筛知识点方面要求并不是很高 简单介绍几种常用积性函数: \(1.\text{欧拉函数:}\phi(x)=\text{ 1-x与x互质的数的个数}\) \(2.\text{莫比乌斯函数:}\mu(x)\text{ 这个函数定义难以描述,可以自行查找}\) \(3.\text{约数个数:}d(x)=\sum_{d|x}1\) \(4.\

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

51NOD 1237 最大公约数之和 V3(杜教筛)

题意 求 $\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)$. 分析 $$\begin{aligned}\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)  &= \sum_{i=1}^n \sum_{j=1}^n d[gcd(i, j)=d] \\&= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n[gcd(i,j=d)] \\&= \sum_{d=1}^n d \sum_{i=1}^{\left \lfl

【51nod-1239&amp;1244】欧拉函数之和&amp;莫比乌斯函数之和 杜教筛

题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 杜教筛裸题,不过现在我也只会筛这俩前缀和... $$s(n)=\sum _{i=1}^{n}f(i)$$ 那么就有: $$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample In