[BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
来源:互联网 发布:网络人气榜 编辑:程序博客网 时间:2024/06/06 10:01
枚举保留的那些数,可以先枚举前缀的gcd,然后因为一个数与log个和它不同的数取gcd后就会变成1,所以可以二分,这样是
不过因为不同前缀gcd个数也只用log个,所以判一下当前枚举到的前缀gcd与上一位相同的话特殊处理就可以了……
T了两发就放弃了……不应该啊
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int N=100010,M=30,P=998244353;int a[N],n;int _gcd[N][M],_log[N];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[n]; 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[N],pre[N],suf[N];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[n],a[n-1]),pos=n-1; else if(i==1) cur=gcd(a[1],a[n]),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;}
阅读全文
0 0
- [BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
- bzoj4921: 互质序列
- [BZOJ4917][Lydsy六月份月赛 .A][模拟]Hash Killer IV
- [BZOJ4920][Lydsy六月份月赛 .D][数学][三分]薄饼切割
- 【gcd分块】BZOJ4921[互质序列]题解
- [BZOJ4919][Lydsy六月份月赛 .C][树上DP][启发式合并]大根堆
- [BZOJ4923][Lydsy六月份月赛 .G][平衡树]K小值查询
- Lydsy八月份月赛
- Lydsy(大视野2017八月份月赛)D--
- 【乱搞】BZOJ5074 [Lydsy十月月赛]小B的数字
- 【bzoj5074】 [Lydsy十月月赛]小B的数字
- [BZOJ]5074: [Lydsy十月月赛]小B的数字
- bzoj5071: [Lydsy十月月赛]小A的数字
- bzoj 5071: [Lydsy十月月赛]小A的数字
- BZOJ 5071 [Lydsy 十月月赛] 排序 解题报告
- BZOJ 5072 [Lydsy 十月月赛] 树DP 解题报告
- bzoj5071 [Lydsy十月月赛]小A的数字
- bzoj5074 [Lydsy十月月赛]小B的数字
- 解决struts中Antlr包冲突问题
- select的fd超过1024将会非常危险------select导致core dump (句柄增多/句柄泄露引起)
- Tcp连接建立释放图
- 网络编程(编写一个小型服务器)--csapp11章
- Note-Day01
- [BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
- 【剑指offer】题目4
- C语言关键字Volatile
- JSP的静态与动态包含
- HDU 6030 Happy Necklace【矩阵快速幂】
- lualib.h详解
- 函数模板的模板参数自动推导探究
- Opencv及Kinect/OpenNI常用学习网址
- IDEA破解办法