【GDKOI2017】小队任务 莫比乌斯反演+杜教筛
题目大意:给你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】小队任务 莫比乌斯反演+杜教筛的更多相关文章
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...
- 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】
用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...
- [HDU 5608]Function(莫比乌斯反演 + 杜教筛)
题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣Nf(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1Nf ...
- 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 ...
- 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
随机推荐
- 17 Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ?
Privacy Lost:Dose Anybody Care ? 失去隐私,有人在乎吗 ? ①Someday a stranger will read your e-mail without your ...
- fortran write格式
advance="no",就是输出不换行. write(*,"(f10.1)",advance="no")A 格式化输出的控制字符非常的丰富 ...
- day16(jdbc进阶,jdbc之dbUtils)
1.jdbc进阶 jdbc事务管理 jdbc中的事务管理其实就是交给了连接对象去管理.先写一个简单的事务管理 public class Demo01 { private static Connecti ...
- centos yum command
yum repolist all -- 列出所有仓库 yum list all -- 列出仓库中所有软件包 yum info package-name -- 查看软件包信息 yum install p ...
- (并查集)A Bug's Life -- POJ -- 2492
链接: http://poj.org/problem?id=2492 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...
- RepositionBars的用法和参数的意义(引用别人的)
MFC窗口位置管理详细分析及实例 在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD风格的窗口).上边是工具栏,中间是视图窗口,下边是状态栏.三个窗 口在框架的客户区里和 ...
- vc中使用SendMessage正确发送自定义消息的方法
最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有 一个能完全做出来的.要知道VC编程有一个小地方出错,都 ...
- DBCC--LOG
DBCC LOGTo retrieve the transaction log for a given database.对应日志文件较大的数据库,慎用该命令Uasge:DBCC LOG(<db ...
- K8S+GitLab-自动化分布式部署ASP.NET Core(一) 部署环境
一.部署流程介绍 开发人员通过Git上传asp.net core 项目到Gilab,并编写好.gitlab-ci.yml , GitLab-Runner 自动拉取代码,然后进行Build,编译,单元测 ...
- C#通过盘符获取剩余空间
public static long GetHardDiskSpace(string str_HardDiskName) { ; str_HardDiskName = str_HardDiskName ...