【BZOJ4916】神犇和蒟蒻(杜教筛)

【BZOJ4916】神犇和蒟蒻(杜教筛)

题面

BZOJ

\[\sum_{i=1}^n\mu(i^2)\ \ 和\ \sum_{i=1}^n\phi(i^2)\]
其中\[n<=10^9\]

题解

第一问
搞笑的
不会做?
算了。。
还是说一下:
想想\(\mu(x)\)是怎么算的???
既然是\(i^2\),每个因数的个数一定不会是\(1\)
所以除了\(\mu(1)\)外一定都是\(0\)
所以第一问的答案一定是\(1\)



第二问:
先看看要求的是什么
\(\phi(i^2)=i*\phi(i)\)
为啥???
想想你线性筛是怎么写的,那么这个东西就很明显了。

\(10^9\)的范围
看着就不能线性筛
于是想到了杜教筛
设\(f(i)=\phi(i^2)=i\phi(i)\)
\(S(n)=\sum_{i=1}^nf(i)\)
现在先搞一个\(g(x)\)出来,可以推出式子
(难道这就是杜教筛的套路式子吗??)
\[g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]

现在要做的就是构造一个\(g(x)\)使得前面那玩意很好算

看一看\(f(i)=i\phi(i)\)
往\(\phi(i)\)的性质上面靠:
\(\sum_{d|i}\phi(d)=i\)

要让\[(f*g)(i)=\sum_{d|i}f(d)g(\frac{i}{d})\]好算前缀和
直接写一下:
\[(f*g)(i)=\sum_{d|i}\phi(d)dg(\frac{i}{d})\]
要是能够把\(d\)给搞掉多好,所以\(g(\frac{i}{d})\)最好能够把\(d\)搞掉
发现令\(g(x)=x\)就可以啦
\[(f*g)(i)=\sum_{d|i}\phi(d)d\frac{i}{d}\]
\[=\sum_{d|i}\phi(d)i\]
\[=i\sum_{d|i}\phi(d)\]
\[=i^2\]
这个玩意的前缀和多好算
\[\sum_{i=1}^n(g*f)(i)=1^2+2^2+.....n^2=\frac{n(n+1)(2n+1)}{6}\]

所以把那个我认为的杜教筛的套路式子拿出来
\[g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})\]
\[S(n)=\frac{n(n+1)(2n+1)}{6}-\sum_{i=2}^niS(\frac{n}{i})\]
看起来可以杜教筛了嗷。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 10000000
#define MOD 1000000007
int n,N;
int pri[MAX+10],phi[MAX+10],tot,inv=166666668;
bool zs[MAX+10];
map<int,int> M;
void pre(int N)
{
    zs[1]=true;phi[1]=1;
    for(int i=2;i<=N;++i)
    {
        if(!zs[i])pri[++tot]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&i*pri[j]<=N;++j)
        {
            zs[i*pri[j]]=true;
            if(i%pri[j])phi[i*pri[j]]=1ll*phi[i]*phi[pri[j]]%MOD;
            else{phi[i*pri[j]]=1ll*phi[i]*pri[j]%MOD;break;}
        }
    }
    for(int i=1;i<=N;++i)phi[i]=(1ll*i*phi[i]%MOD+phi[i-1])%MOD;
}
int S(int x)
{
    if(x<=N)return phi[x];
    if(M[x])return M[x];
    int ret=1ll*x*(x+1)%MOD*(x+x+1)%MOD*inv%MOD;
    for(int i=2,j;i<=x;i=j+1)
    {
        j=x/(x/i);
        int tt=1ll*(i+j)*(j-i+1)/2%MOD;
        ret-=1ll*tt*S(x/i)%MOD;
        ret%=MOD;
    }
    return M[x]=(ret+MOD)%MOD;
}
int main()
{
    scanf("%d",&n);puts("1");
    pre(N=min(n,MAX));
    printf("%d\n",S(n));
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8297338.html

时间: 2024-11-09 04:01:17

【BZOJ4916】神犇和蒟蒻(杜教筛)的相关文章

[bzoj4916] 神犇和蒟蒻 [杜教筛]

题面: 传送门 一句话,就是让你求$\mu\left(i^2\right)$以及$\varphi\left(i^2\right)$的前缀和 思路: 第一问,瞪了一会儿恍然大悟:这不就是1吗...... 因为对于$\mu\left(i^2\right)$,$i^2=i\ast i$,那么$\mu\left(i^2\right)$在$i\neq1$的时候值都是0 所以第一问输出1就好了...... 接下来看第二问 这一问中解决$\varphi\left(i^2\right)$是关键,因为这东西是个积

【BZOJ4916】神犇和蒟蒻 杜教筛

[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 题解:哎?上面的那个东西好像一直是1?(废话),然后 设j=i/d,

bzoj 4916 神犇和蒟蒻 杜教筛

第一题结合莫比乌斯函数定义,值恒为1. 第二题,phi(i^2) = phi(i) * i,根据欧拉函数的定义式能推出来,每个质因子的指数都增加一倍,都提出来一份,就是原先的phi(i)*i.然后还是跟g(x)卷一下,杜教筛即可. 1 #include <cstdio> 2 #include <map> 3 #include <cmath> 4 using namespace std; 5 typedef long long ll; 6 const int MAXN =

bzoj4916 神犇和蒟蒻

Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 正解:杜教筛. 第一问答案是$1$. 第二问,先给个结论:$\varphi (n^{2})=n\va

[模板]杜教筛

用途 比线性更快($O(n^{\frac{2}{3}})$)地求积性函数的前缀和 前置知识:狄利克雷卷积 形如$h(n)=\sum\limits_{d|n}f(d)g(\frac{n}{d})$,则称$h(n)=f(x)*g(x)$ 如果f和g都是积性函数,则卷出的h也是积性函数 可以证明,狄利克雷卷积满足交换律.结合律.分配律 比较重要的卷积式子(抄的..): $$\mu*1=\varepsilon , \varepsilon(n)=[n=1]$$ $$\varphi*1=id , id(n)

莫比乌斯函数与杜教筛

前人的文章已经很详尽了,这里只作一点补充. 莫比乌斯反演与莫比乌斯函数入门资料:https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html 讲的非常清楚,这里稍微补充一下: 1.虽然考试肯定不会考,但是对于定理的证明还是应该大概了解一下的.关于欧拉函数φ与莫比乌斯函数μ,由于它们都是积性函数,所以很多性质都可以用类似数学归纳法的方法证明.过程是:(1)对于一个性质证明在x为素数是成立 (2)对于素数p和一个正整数a,设此性质对a与p均成立

【学术篇】分析矿洞 杜教筛

数论什么的都去死吧! 看着题解我都能化式子用完4页草纸... 另外吐槽一句出题人的拼音学的是真好, 不知道是不是故意的. 其实题解已经写得挺详细的了. 我就是提一些出题人觉得太easy没必要提但是做题还是需要的一些东西....(因为这些东西我基本都是现学的) 然而之前刚刚学完mobius反演就暂时性脱坑的我啥也不会啊.. 看到前排dp和曲神在水luogu的欢(bao/du)乐(ling/liu)赛, 就想去看看. 然后就点了报名但是发现自己什么都不会. 去看了看T1. 就是这道题. 然后成功的化

SCUT - 354 - CC的简单多项式 - 杜教筛

https://scut.online/p/354 跟多项式一点关系都没有. 注意到其实两个多项式在1处求值,那么就是他们的系数加起来. 列一列发现系数就是n以内两两求gcd的值,还自动把0去掉了. 那么就是 \(\sum\limits_{i=1}^{n}\sum\limits_{i=1}^{n}gcd(i^2,j^2)\) 这种情况就要枚举g但是为了方便我们也是枚举g而不是g平方 \(\sum\limits_{g=1}^{n}g^2\sum\limits_{i=1}^{n}\sum\limit

【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