【HDU4676】Sum Of Gcd(莫队+欧拉函数)
大致题意: 多组询问,求\(\sum_{i=L}^R\sum_{j=i+1}^Rgcd(i,j)\)。
推式子
这道题我们可以考虑,每个因数\(d\)被统计答案的次数,肯定与其出现次数有关。
设它出现次数为\(cnt_d\),则可以猜测答案为:
\]
这显然是错的,因为\(d\)虽作为公因数,却不一定是最大公约数。
所以就可以考虑容斥。
对于一个统计过的数\(x\),按照我们先前的做法,对于任意\(d|x\),\(d\)一定都被统计过了。
可以发现,这似乎恰好是一个欧拉函数。
于是式子就可以化成:
\]
求解
我们先用线性筛筛出欧拉函数,然后预处理出每个数的因数。
接下来对于这种区间问题,自然可以用莫队来搞。
每次转移时枚举因数更新答案即可。
但还有个问题,枚举因数更新答案似乎会\(TLE\)?
但据\(hl666\)神仙证明,每个数的因数个数是\(O(N^{\frac13})\)的!
这样时间复杂度就是\(O(N^{\frac{11}6})\),而\(N\le20000\),可以过。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 20000
#define LL long long
using namespace std;
int n,a[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void writes(Con string& x) {for(RI i=0,l=x.length();i^l;++i) pc(x[i]);}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
class CaptainMotao//莫队
{
private:
static const int Q=20000;int Bsz,cnt[N+5];LL res,ans[Q+5];
struct Query//存储询问
{
int l,r,bl,pos;I Query(CI x=0,CI y=0,CI b=0,CI p=0):l(x),r(y),bl(b),pos(p){}
I bool operator < (Con Query& t) const {return bl^t.bl?bl<t.bl:(bl&1?r<t.r:r>t.r);}//排序
}q[Q+5];
class LineSiever//初始化
{
private:
static const int SZ=N;int Pcnt,P[SZ+5];
public:
int phi[SZ+5];vector<int> fac[SZ+5];
I LineSiever()
{
RI i,j;for(phi[1]=1,i=2;i<=SZ;++i) for(!P[i]&&(phi[P[++Pcnt]=i]=i-1),j=1;1LL*i*P[j]<=SZ;++j)
if(P[i*P[j]]=1,i%P[j]) phi[i*P[j]]=phi[i]*(P[j]-1);else {phi[i*P[j]]=phi[i]*P[j];break;}
for(i=1;i<=SZ;++i) for(j=i;j<=SZ;j+=i) fac[j].push_back(i);
}
}S;
I void Add(CI x) {for(RI i=0,s=S.fac[x].size();i^s;++i) res+=1LL*S.phi[S.fac[x][i]]*cnt[S.fac[x][i]]++;}//增大区间
I void Del(CI x) {for(RI i=0,s=S.fac[x].size();i^s;++i) res-=1LL*S.phi[S.fac[x][i]]*--cnt[S.fac[x][i]];}//缩小区间
public:
I void Solve()//求解答案
{
RI Qtot,i,x,y,L=1,R=0;memset(cnt,0,sizeof(cnt)),Bsz=sqrt(n),F.read(Qtot);
for(i=1;i<=Qtot;++i) F.read(x,y),q[i]=Query(x,y,(x-1)/Bsz+1,i);//读入数据
for(res=0,sort(q+1,q+Qtot+1),i=1;i<=Qtot;++i)//排序并处理
{
W(R<q[i].r) Add(a[++R]);W(L>q[i].l) Add(a[--L]);W(R>q[i].r) Del(a[R--]);W(L<q[i].l) Del(a[L++]);//更新区间
ans[q[i].pos]=res;//记录答案
}static int t=0;F.writes("Case #"),F.write(++t),F.writes(":\n");
for(i=1;i<=Qtot;++i) F.writeln(ans[i]);//输出答案
}
}C;
int main()
{
RI Ttot,i;F.read(Ttot);W(Ttot--)
{
for(F.read(n),i=1;i<=n;++i) F.read(a[i]);//读入
C.Solve();//莫队求解
}return F.clear(),0;
}
【HDU4676】Sum Of Gcd(莫队+欧拉函数)的更多相关文章
- HDU-4676 Sum Of Gcd 莫队+欧拉函数
题意:给定一个11~nn的全排列AA,若干个询问,每次询问给出一个区间[l,r][l,r],要求得出∑l≤i<j≤r gcd(Ai,Aj)的值. 解法:这题似乎做的人不是很多,蒟蒻当然不会做只 ...
- GCD nyoj 1007 (欧拉函数+欧几里得)
GCD nyoj 1007 (欧拉函数+欧几里得) GCD 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The greatest common divisor ...
- HDU 4676 Sum Of Gcd 【莫队 + 欧拉】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=4676 Sum Of Gcd Time Limit: 10000/5000 MS (Java/Others ...
- Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3241 Solved: 1437[Submit][Status][Discuss ...
- UVA 11424 GCD - Extreme (I) (欧拉函数+筛法)
题目:给出n,求gcd(1,2)+gcd(1,3)+gcd(2,3)+gcd(1,4)+gcd(2,4)+gcd(3,4)+...+gcd(1,n)+gcd(2,n)+...+gcd(n-1,n) 此 ...
- hdu 1695 GCD 容斥+欧拉函数
题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ...
- HDU1695:GCD(容斥原理+欧拉函数+质因数分解)好题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题目解析: Given 5 integers: a, b, c, d, k, you're to ...
- UVA11426 GCD - Extreme (II)---欧拉函数的运用
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- luogu2658 GCD(莫比乌斯反演/欧拉函数)
link 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 1<=N<=10^7 (1)莫比乌斯反演法 发现就是YY的GCD,左转YY的GCD ...
随机推荐
- spark 2.X 疑难问题汇总
当前spark任务都是运行在yarn上,所以不用启动长进程worker,也没有master的HA问题,所以主要的问题在任务执行层面. 作业故障分类故障主要分为版本,内存和权限三方面. - 各种版本不一 ...
- java 数据库连接
一.JDBC(Java Database Connectivity) JDBC是Java语言中访问数据库的应用程序接口,可以为多种关系数据库提供统一访问. jdbc.properties jdbc.d ...
- 关于在JS中设置标签属性
Attribute 该属性主要是用来在标签行内样式,添加.删除.获取属性.且适用于自定义属性. setAttribute("属性名",属性值“”):这个是用来设置标签属性的: re ...
- Xshell上Linux上传下载文件
Xshell上的Linux想要进行文件的上传和下载可以使用以下命令: #rz //将本地的文件上传到Linux服务器,执行后会弹出选择文件的框 #sz filename //将 filename 这个 ...
- 关于vue路由嵌套遇到的坑~
关键在于子路由中的path问题,path之前不要放/ <!DOCTYPE html> <html lang="en"> <head> <m ...
- 牛客网Java刷题知识点之内存的划分(寄存器、本地方法区、方法区、栈内存和堆内存)
不多说,直接上干货! 其中 1)程序计数器:用于指示当前线程所执行的字节码执行到了第几行,可以理解为当前线程的行号指示器.每个计数器志勇赖记录一个线程的行号,所以它是线程私有的. ...
- pat06-图4. Saving James Bond - Hard Version (30)
06-图4. Saving James Bond - Hard Version (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...
- oracle 找回被覆盖的存储过程
登录到sys账户下 1.TO_TIMESTAMP('2014-05-04 14:33:00', 'YYYY-MM-DD HH24:MI:SS') 删除前的日期 2.owner 表空调 3.Name ...
- node Error: Could not locate the bindings file. Tried:解决
问题描述: Error: Could not locate the bindings file. Tried: → C:\code\xxx\node_modules\deasync\build\dea ...
- 一、简单gridview列表展示
1.HomeController public ActionResult Index() { //返回绑定models的index.cshtml return View(NorthwindDataPr ...