hdu4676 Sum Of Gcd
2016-07-13 11:19
197 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4676题目大意:
∑Ri=L∑Rj=i+1gcd(a[i],[j])解题思路:
用莫队算法优化,同时用到一个技巧:一个数n与一个集合中每个数的最大公约数的和=∑d∣nphi(d)∗num(d),phi(n)为欧拉函数,num(n)为当前集合中有因子n的数の个数。另外一种思路参考http://www.cnblogs.com/oldmanren/p/3661936.html
代码
#include<cstdio> #include<algorithm> #include<vector> #include<cmath> #include<cstring> #define LL long long using namespace std; int seq[20010]; struct Node{ int l,r,b,id; }; Node query[20010]; LL L,R,sum,ans[20010]; int num[20010],phi[20010]; vector<int> fac[20005]; void init(){ for(int i=1;i<=20001;++i) phi[i]=i; for(int i=2;i<=20001;++i) if(phi[i]==i) for(int j=i;j<=20001;j+=i) phi[j]=phi[j]/i*(i-1); for(int i=1;i<=20001;++i) for(int j=i;j<=20001;j+=i) fac[j].push_back(i); } bool cmp(Node x,Node y){ if(x.b==y.b) return x.r<y.r; return x.b<y.b; } LL add(int val){ LL ret=0; for(int i=0;i<fac[val].size();++i) ret+=phi[fac[val][i]]*(num[fac[val][i]]++); return ret; } LL del(int val){ LL ret=0; for(int i=0;i<fac[val].size();++i) ret+=phi[fac[val][i]]*(--num[fac[val][i]]); return ret; } void work(int l,int r,int x){ if(x){ for(int i=l;i<L;++i) sum+=add(seq[i]); for(int i=R+1;i<=r;++i) sum+=add(seq[i]); for(int i=L;i<l;++i) sum-=del(seq[i]); for(int i=r+1;i<=R;++i) sum-=del(seq[i]); } else{ sum=0; for(int i=l;i<=r;++i) sum+=add(seq[i]); } L=l;R=r; } int main(){ int t; init(); scanf("%d",&t); for(int ca=1;ca<=t;++ca){ int n,m; memset(num,0,sizeof(num)); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",seq+i); } int blockSize=(int)sqrt(n*1.0); scanf("%d",&m); for(int i=0;i<m;++i){ scanf("%d%d",&query[i].l,&query[i].r); query[i].b=query[i].l/blockSize; query[i].id=i; } sort(query,query+m,cmp); for(int i=0;i<m;++i){ work(query[i].l,query[i].r,i); ans[query[i].id]=sum; } printf("Case #%d:\n",ca); for(int i=0;i<m;++i) printf("%I64d\n",ans[i]); } system("pause"); return 0; }
总结:
两个数的最大公约数等于两个数公因子的欧拉函数的和,推论一个数n与一个集合中每个数的最大公约数的和=∑d∣nphi(d)∗num(d),phi(n)为欧拉函数,num(n)为当前集合中有因子n的数の个数。本质上是n=∑d∣nφ(d)两百万以内的数因子数至多有288个。
相关文章推荐
- 常用下载地址ed2k
- 标准IO流与系统调用write read区别
- SpringMVC+Spring+Mybatis整合配置
- include_path详解
- jsp页面向action传值乱码的问题
- android camera系统3A模式及其状态转换(二)
- JVM默认参数记录
- Ubuntu 14.04 LTS 下实用软件
- KETTLE常见问题和优化
- 解决bean的繁琐配置
- Android-BroadcastReceiver
- JMS学习(5):--自定义接收者
- 享元模式
- android camera系统3A模式及其状态转换(一)
- C中将格式化数据写入到文件中操作
- Swift - 属性观察者(willSet与didSet)
- raspberry pi 2 finalspeed 自启服务
- Hibernate
- ScheduledExecutorService
- HDU1215——数论解法