题目大意:给你n,求$\sum_{i=1}^{n}\sum_{j=i}^{n}[gcd(i,j)=1](i+1)(j+1)$

子任务一:暴力

子任务二:$T=50000,n≤10^7$

子任务三:$T=3,n≤10^{10}$

解法一:

我们化一下这个式子

$\sum_{i=1}^{n}\sum_{j=i}^{n}[gcd(i,j)=1](i+1)(j+1)$

$=\sum_{i=1}^{n}\sum_{j=i}^{n}\sum_{k|gcd(i,j)} \mu(k)(i+1)(j+1)$

$=\frac{1}{2}\bigg(4+\sum_{d=1}^{n}\sum_{i=1}^{Q}\sum_{j=1}^{Q}(di+1)(dj+1)\bigg)$其中$Q=\lfloor \frac{n}{d} \rfloor $,下面同理

$=\frac{1}{2}\bigg(4+\sum_{d=1}^{n}\mu(d)(Q^2+d(1+Q)Q^2+d^2(\frac{(1+Q)Q}{2})^2)\bigg)$

不难发现,这个式子可以预处理出$\mu(i)$的前缀和,然后通过根号分块的方法,实现单次$O(\sqrt{n})$时间复杂度的询问操作。在前两个子任务中,时间复杂度为$O(T\sqrt{n})$。

在第三个子任务中,我们采用杜教筛求$\mu$的前缀和,即可实现求得答案。

但是问题在于,该题单点的时限为15s,本蒟蒻经过大力卡常后,第二个子任务依然只能在17s左右跑出。

我们考虑换一个做法,还是刚才的式子

$\sum_{i=1}^{n}\sum_{j=i}^{n}[gcd(i,j)=1](i+1)(j+1)$

考虑到要让$gcd(i,j)=1$,那么在i不变的情况下,共有$\varphi(i)$个数,它们的和为$\frac{1}{2}i\times \varphi(i)$。

那么原式为:

$=\frac{1}{2}\sum_{i=1}^{n}(i+1)(i+2)\varphi(i)$

$=\frac{1}{2}\sum_{i=1}^{n}\bigg(2(i+1)\varphi(i)+i(i+1)\varphi(i) \bigg)$

$=\frac{1}{2}\bigg( 2\sum_{i=1}^{n}\varphi(i)+3\sum_{i=1}^{n}i\varphi(i)+\sum_{i=1}^{n}i^2\varphi(i) \bigg)$

该式子,我们可以预处理出$\varphi(i)$,$i\varphi(i)$,$i^2\varphi(i)$的前缀和,那么当n≤10^7时,可以实现O(1)求得答案

对于第三个子任务,$n≤10^{10}$,显然不可以预处理到$10^{10}$,求$\varphi(i)$,$i\varphi(i)$,$i^2\varphi(i)$的前缀和,我们可以通过杜教筛+预处理实现$O(n^{\frac{2}{3}})$的单次询问,可以通过第三个子任务。

杜教筛部分详见代码,在此不再展开。

完结撒花

 #include<bits/stdc++.h>
#define L long long
#define MOD 1000000007
#define I2 500000004
#define I6 166666668
#define M 19890604
using namespace std;
int pri[M/]={},b[M]={},use=;
int phi[M][]={}; L get(L n,L op){
n%=MOD;
if(op==) return n;
if(op==) return ((+n)*n/)%MOD;
if(op==) return n*(n+)%MOD*(*n+)%MOD*I6%MOD;
n=(n*(n+)/)%MOD; return n*n%MOD;
}
map<L,L> mp[];
L PHI(L n,L k){
if(n<M) return phi[n][k];
if(mp[k][n]) return mp[k][n];
L res=get(n,k+);
for(L i=,j;i<=n;i=j+){
j=n/(n/i);
res=(res-(get(j,k)-get(i-,k))*PHI(n/i,k))%MOD;
}
return mp[k][n]=res;
} L Main(){
L n; scanf("%lld",&n);
L p1=PHI(n,),p2=PHI(n,),p3=PHI(n,);
L ans=(p1*+p2*+p3)%MOD*I2%MOD;
printf("%lld\n",(ans++MOD)%MOD);
} int main(){
phi[][]=phi[][]=phi[][]=;
for(L i=;i<M;i++){
if(b[i]==) pri[++use]=i,phi[i][]=i-;
for(L j=;j<=use&&i*pri[j]<M;j++){
b[i*pri[j]]=;
if(i%pri[j]==){phi[i*pri[j]][]=phi[i][]*pri[j]; break;}
phi[i*pri[j]][]=phi[i][]*(pri[j]-);
}
}
for(L i=;i<M;i++){
phi[i][]=(phi[i-][]+1LL*i*i%MOD*phi[i][])%MOD;
phi[i][]=(phi[i-][]+i*phi[i][])%MOD;
phi[i][]=(phi[i-][]+phi[i][])%MOD;
}
L cas; cin>>cas;
while(cas--) Main();
}

【GDKOI2017】小队任务 莫比乌斯反演+杜教筛的更多相关文章

  1. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  2. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  3. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  4. 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)

    点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...

  5. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  6. [HDU 5608]Function(莫比乌斯反演 + 杜教筛)

    题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣N​f(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1N​f ...

  7. BSOJ5467 [CSPX2017#3]整数 莫比乌斯反演+杜教筛

    题意简述 给你两个整数\(n\),\(k\),让你求出这个式子 \[ \sum_{a_1=1}^n \sum_{a_2=a_1}^n \sum_{a_3=a_2}^n \cdots \sum_{a_k ...

  8. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  9. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解

    题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...

随机推荐

  1. 17 Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ?

    Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ? ①Someday a stranger will read your e-mail without your ...

  2. fortran write格式

    advance="no",就是输出不换行. write(*,"(f10.1)",advance="no")A 格式化输出的控制字符非常的丰富 ...

  3. day16(jdbc进阶,jdbc之dbUtils)

    1.jdbc进阶 jdbc事务管理 jdbc中的事务管理其实就是交给了连接对象去管理.先写一个简单的事务管理 public class Demo01 { private static Connecti ...

  4. centos yum command

    yum repolist all -- 列出所有仓库 yum list all -- 列出仓库中所有软件包 yum info package-name -- 查看软件包信息 yum install p ...

  5. (并查集)A Bug's Life -- POJ -- 2492

    链接: http://poj.org/problem?id=2492 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...

  6. RepositionBars的用法和参数的意义(引用别人的)

    MFC窗口位置管理详细分析及实例 在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD风格的窗口).上边是工具栏,中间是视图窗口,下边是状态栏.三个窗 口在框架的客户区里和 ...

  7. vc中使用SendMessage正确发送自定义消息的方法

    最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有 一个能完全做出来的.要知道VC编程有一个小地方出错,都 ...

  8. DBCC--LOG

    DBCC LOGTo retrieve the transaction log for a given database.对应日志文件较大的数据库,慎用该命令Uasge:DBCC LOG(<db ...

  9. K8S+GitLab-自动化分布式部署ASP.NET Core(一) 部署环境

    一.部署流程介绍 开发人员通过Git上传asp.net core 项目到Gilab,并编写好.gitlab-ci.yml , GitLab-Runner 自动拉取代码,然后进行Build,编译,单元测 ...

  10. C#通过盘符获取剩余空间

    public static long GetHardDiskSpace(string str_HardDiskName) { ; str_HardDiskName = str_HardDiskName ...