【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\) 思路: 杜教筛基础题? 很显然这里已经设 ...
随机推荐
- myeclipse 中 svn 更新 提交 同步资源库 详细解释下他们的功能
原理是这样的 svn服务器一般放在公共的服务器上,大家连这个服务器,在MyEclipse上使用svn控件 可以下载svn上的项目至本地,所以很多公司将开发要用到的软件都放在svn上,有同事来只要连上s ...
- Android 在一个程序中启动另一个程序(包名,或者类名)
http://hi.baidu.com/xiaofanqing/item/6fd724f7c5bb6dce531c26b7 Android 开发有时需要在一个应用中启动另一个应用,比如Launcher ...
- Yii框架请求
$request = Yii::$app->request; $get = $request->get(); // 等价于: $get = $_GET; $id = $request-&g ...
- 一个 图片 滚动 飞入的css特效
@keyframes bounceInLeft { from, 60%, 75%, 90%, to {animation-timing-function: cubic-bezier(0.215, 0. ...
- <%@ include file=""%>与<jsp:include page=""/>
https://www.cnblogs.com/sharpest/p/6117629.html
- python获取目录下所有文件
#方法1:使用os.listdir import os for filename in os.listdir(r'c:\\windows'): print filename #方法2:使用glob模块 ...
- siganl tappII的应用及MATLAB调用
1.在应用SIGNAL TAPPII时一定要把不用的端口设置为输入三态,否则观察不到数据. 2.用SIGNAL TAPII 观察数据时双向是观察不到数据的,但模块内部用于传输双向口数据的寄存器可以看到 ...
- 三)mybatis 二级缓存,整合ehcache
mybatis-config.xml <setting name="cacheEnabled" value="true" /> PersonMapp ...
- python Cannot uninstall 'numpy'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
在Python中移除(升级)numpy的时候出现: Cannot uninstall 'numpy'. It is a distutils installed project and thus we ...
- SSH中设置字符编码防止乱码
1.在web.xml中加入一个过滤器和过滤范围的配置 <filter><filter-name>encoding</filter-name><filter-c ...