【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\) 思路: 杜教筛基础题? 很显然这里已经设 ...
随机推荐
- 20155333 2016-2017-2 《Java程序设计》第八周学习总结
20155333 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 认识NIO NIO(New IO)-from JDK1.4 Channel: 衔接数据节点( ...
- KbmMW 服务器架构简介
kbmmw 由于文档比较少,很多同学开始用时很难理解.一直准备写一个关于kbmmw 架构的东西. 这几天与红鱼儿(blog)研究服务器线程时,整理了一下,大概画了一下kbmmw (版本4.5)服务器的 ...
- 2018.07.04 POJ 1113 Wall(凸包)
Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...
- cmake-add_definitions
add_definitions: Adds -D define flags to the compilation of source files. add_definitions(-DFOO -DBA ...
- Python 运行 Python hello.py 出错,提示: File "<stdin>" , line 1
写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...
- ubuntu 14.04查看java的安装路径
有时候,使用apt-get install 安装了某个软件之后,却不知道这个软件的安装路径在哪里. 那怎么样去找出这个软件的安装路径呢? 下面我们java 这个软件为例, 找出ubuntu 14.04 ...
- (连通图 模板题 无向图求割点)Network --UVA--315(POJ--1144)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- CGA填充算法之种子填充算法
CGA填充算法之种子填充算法 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界 (也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜 ...
- spring mvc静态资源请求和<mvc:annotation-driven>
自己看了官方文档,也到网上查了下,目前理解如下: <mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和Annotat ...
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?
场景:在平常我们使用word文档等等office办公软件时,我们常会使用搜索->替换的功能. mysql: 在mysql 中有时候,我们也需要这样子的实现: 实现 SQL 语句: update ...