[Codeforces#475D]CGCDSSQ(st表+二分+数学相关)
来源:互联网 发布:关键词seo排名 编辑:程序博客网 时间:2024/05/01 09:44
题目描述
传送门
题意:对于每一个
题解
设
第一个性质非常显然,第二个性质的话由于每一次gcd变化都至少是/2了,那么至多变化
枚举区间的起点l,每一次二分gcd变化的点,然后统计区间数量。需要快速查询一段区间的gcd值,用st表可以实现
代码
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<map>using namespace std;#define LL long long#define N 300005#define sz 17int n,q,g,loc,last;int a[N],x[N],st[N][sz+5],lg2[N];map <int,LL> ans;int gcd(int a,int b){ if (!b) return a; else return gcd(b,a%b);}void init(){ for (int i=1,p=0;i<=n;++i) { while ((1<<p)<=i) ++p; lg2[i]=p-1; } for (int i=1;i<=n;++i) st[i][0]=a[i]; for (int j=1;j<sz;++j) for (int i=1;i<=n;++i) if (i+(1<<j)-1<=n) st[i][j]=gcd(st[i][j-1],st[i+(1<<(j-1))][j-1]);}int query(int l,int r){ if (l>r) return 0; int k=lg2[r-l+1]; return gcd(st[l][k],st[r-(1<<k)+1][k]);}int find(int s,int x){ int l=s,r=n,mid,ans=n+1; while (l<=r) { mid=(l+r)>>1; int t=query(s,mid); if (x>=t) ans=mid,r=mid-1; else l=mid+1; } return ans;}int main(){ scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&a[i]); init(); scanf("%d",&q); for (int i=1;i<=q;++i) scanf("%d",&x[i]); for (int i=1;i<=n;++i) { g=a[i];last=i;loc=i; while (loc<=n) { loc=find(i,g-1); ans[g]+=(LL)loc-(LL)last; g=query(i,loc);last=loc; } } for (int i=1;i<=q;++i) printf("%I64d\n",ans[x[i]]);}
总结
①这个关于gcd的性质要记住。遇到数学相关的题性质要大胆想。
0 0
- [Codeforces#475D]CGCDSSQ(st表+二分+数学相关)
- codeforces 475D CGCDSSQ ST表+二分
- codeforces 475D CGCDSSQ (st表+数论)
- [Codeforces475D]CGCDSSQ(数学相关+二分)
- 【codeforces】 475D CGCDSSQ
- Codeforces 475 D. CGCDSSQ
- CodeForces 475D CGCDSSQ
- CodeForces 475D CGCDSSQ
- CodeForces 475D CGCDSSQ RMQ
- Codeforces 475D CGCDSSQ 题解
- codeforces 689D ST表+二分 模板
- 【CODEFORCES】 D. CGCDSSQ
- codeforces 689D Friends and Subsequences st表+二分
- CodeForces 359 D.Pair of Numbers (二分+ST)
- codeforces Round #361 D. Friends and Subsequences (ST表,二分)
- Codeforces 689D. Friends and Subsequences(二分/尺取 + ST表)
- ST表与二分 (CodeForces 689D-Friends and Subsequences)
- CF - 475 - D. CGCDSSQ(枚举)
- SpringMvc的点点滴滴之springMvc的配置
- SQLSERVER sa 账号被锁定
- Leetcode刷题记——27. Remove Element(移除数组元素)
- sql之left join、right join、inner join的区别
- 让文件管理器识别某种类型的文件并显示相应类型的图片
- [Codeforces#475D]CGCDSSQ(st表+二分+数学相关)
- Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
- SQL SERVER中强制类型转换cast和convert的区别
- 使用glob 同步获取指定文件夹下的文件
- python多版本在windows中的切换
- JDBC
- 代理<delegate>通知中心<Notification Center>键值监听或者是键值观察<Key Value Observing>
- Hydrant-Lib
- 安装好ubuntu16.04后要做的事