F - Rectangle GCD

https://atcoder.jp/contests/abc254/tasks/abc254_f

gcd 有个优美的性质,gcd(a,b)=gcd(b,ab)

证明:

不妨设 abgcd(a,b)=d,a=b+c

显然有 c=abcd=adbd

所以 d|c,所以 d|ab

那么考虑数归不断扩展,对于 n 个数就有 gcd(a1,a2,...,an)=gcd(a1,a2a1,...,anan1)

证明考虑 gcd(a1,a2)=gcd(a2,a1)=gcd(a1,a2a1),又考虑 gcd 有可并性,操作下去即可。

那么这道题就做完了。

#include <bits/stdc++.h> #define pb push_back using namespace std; const int N=(int)(2e5+5); int n,q,a[N],b[N],c[N],d[N],f1[20][N],f2[20][N]; int gcd(int x,int y) { return !y?x:gcd(y,x%y); } int get1(int l,int r) { int qwq=log2(r-l+1); return gcd(f1[qwq][l],f1[qwq][r-(1ll<<qwq)+1]); } int get2(int l,int r) { int qwq=log2(r-l+1); return gcd(f2[qwq][l],f2[qwq][r-(1ll<<qwq)+1]); } signed main() { cin.tie(0); ios::sync_with_stdio(false); cin>>n>>q; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) cin>>b[i]; for(int i=2;i<=n;i++) c[i]=abs(a[i]-a[i-1]),d[i]=abs(b[i]-b[i-1]); // cout<<"xgf"; for(int i=1;i<=n;i++) f1[0][i]=c[i]; for(int i=1;(1ll<<i)<=n;i++) for(int j=2;j+(1ll<<i)-1<=n;j++) { // cout<<f1[i-1][j]<<" "<<f1[i-1][j+(1ll<<(i-1))]<<'\n'; f1[i][j]=gcd(f1[i-1][j],f1[i-1][j+(1ll<<(i-1))]); } for(int i=1;i<=n;i++) f2[0][i]=d[i]; for(int i=1;(1ll<<i)<=n;i++) for(int j=2;j+(1ll<<i)-1<=n;j++) f2[i][j]=gcd(f2[i-1][j],f2[i-1][j+(1ll<<(i-1))]); // cout<<"xgf"; while(q--) { int x,y,xx,yy; cin>>x>>xx>>y>>yy; int res=a[x]+b[y]; if(y+1<=yy) res=gcd(res,get2(y+1,yy)); if(x+1<=xx) res=gcd(res,get1(x+1,xx)); cout<<res<<'\n'; } return 0; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/16474472.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示