[BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
2017-06-25 16:46
525 查看
枚举保留的那些数,可以先枚举前缀的gcd,然后因为一个数与log个和它不同的数取gcd后就会变成1,所以可以二分,这样是nlog2n的,为什么网上有人说两个log能过……
不过因为不同前缀gcd个数也只用log个,所以判一下当前枚举到的前缀gcd与上一位相同的话特殊处理就可以了……
T了两发就放弃了……不应该啊
不过因为不同前缀gcd个数也只用log个,所以判一下当前枚举到的前缀gcd与上一位相同的话特殊处理就可以了……
T了两发就放弃了……不应该啊
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int N=100010,M=30,P=998244353; int a ,n; int _gcd [M],_log ; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline void rea(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc()); } int gcd(int x,int y){ return y?gcd(y,x%y):x; } inline void Pre(){ for(int i=1;i<=n;i++) _log[i]=_log[i-1]+((1<<_log[i-1]+1)==i); int t=_log ; for(int i=1;i<=n;i++) _gcd[i][0]=a[i]; for(int k=1;k<=t;k++) for(int i=1;i+(1<<k)-1<=n;i++) _gcd[i][k]=gcd(_gcd[i][k-1],_gcd[i+(1<<k-1)][k-1]); } inline int check(int l,int r){ int t=_log[r-l+1]; return gcd(_gcd[l][t],_gcd[r-(1<<t)+1][t]); } inline int query(int l,int r,int x){ int t=_log[r-l+1]; return (_gcd[l][t]%x==0)&&(_gcd[r-(1<<t)+1][t]%x==0); } int ans,subans ,pre ,suf ; int main(){ rea(n); for(int i=1;i<=n;i++) rea(a[i]),pre[i]=gcd(pre[i-1],a[i]); for(int i=n;i;i--) suf[i]=gcd(suf[i+1],a[i]); Pre(); for(int i=0;i<n-1;i++) if(i<3||pre[i]!=pre[i-1]){ int cur,pos; if(i==0) cur=gcd(a ,a[n-1]),pos=n-1; else if(i==1) cur=gcd(a[1],a ),pos=n; else cur=check(1,i),pos=n+1; while(cur^1&&pos>i+1){ int l=i+2,r=pos-1,nxt=pos,mid; while(l<=r){ mid=l+r>>1; if(!query(mid,pos-1,cur)) l=mid+1; else r=(nxt=mid)-1; } subans[i]=(1LL*(pos-nxt+1)*cur%P+subans[i])%P; pos=nxt-1; cur=gcd(cur,a[pos]); } subans[i]=(1LL*(pos-i-1)*cur%P+subans[i])%P; } else subans[i]=(1LL*subans[i-1]+P-gcd(pre[i],suf[i+1]))%P; for(int i=0;i<n-1;i++) ans=(ans+subans[i])%P; printf("%d\n",(ans+check(1,n-1))%P); return 0; }
相关文章推荐
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
- BZOJ 4921: 互质序列 数学 枚举
- [BZOJ4917][Lydsy六月份月赛 .A][模拟]Hash Killer IV
- [BZOJ4919][Lydsy六月份月赛 .C][树上DP][启发式合并]大根堆
- [BZOJ4920][Lydsy六月份月赛 .D][数学][三分]薄饼切割
- bzoj 4921: 互质序列 数学+枚举
- 【BZOJ4952】lydsy七月月赛 E 二分答案
- bzoj 1049: [HAOI2006]数字序列【dp+二分+瞎搞】
- 【gcd分块】BZOJ4921[互质序列]题解
- BZOJ 4801([Lydsy2017年4月月赛]打牌-分类讨论)
- 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案
- BZOJ 4884 [Lydsy2017年5月月赛]太空猫(单调DP)
- bzoj 4831: [Lydsy2017年4月月赛]序列操作
- bzoj4878: [Lydsy2017年5月月赛]挑战NP-Hard
- BZOJ1014 火星人prefix Splay维护序列hash值+二分答案判LCP
- BZOJ4881 [Lydsy2017年5月月赛]线段游戏
- bzoj 4884 [Lydsy2017年5月月赛]太空猫(简单dp)
- BZOJ4886 [Lydsy2017年5月月赛]叠塔游戏
- bzoj4879: [Lydsy2017年5月月赛]失控的数位板
- bzoj 4878 [Lydsy2017年5月月赛]挑战NP-Hard(dfs)