BZOJ 4921: 互质序列 数学 枚举
2017-07-02 22:30
381 查看
4921: 互质序列
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 112 Solved: 61
[Submit][Status][Discuss]
Description
你知道什么是“互质序列”吗?那就是所有数的最大公约数恰好为1的序列。“互质序列”非常容易找到,但是我们可以尝试通过删除这个序列的一个非空连续子序列来扩大它的最大公约数。
现在给定一个长度为n的序列,你需要从中删除一个非空连续子序列,使得剩下至少2个数,令E为剩下数的最大公约数的期望值,S为合法的方案数,请计算E*S的值。因为这个值可能非常大,请对998244353取模输出。
Input
第一行包含一个正整数n(3<=n<=100000),表示序列的长度。第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=10^9),分别表示序列中的每个元素。
Output
输出一行一个整数,即E*S mod 998244353的值。Sample Input
53 4 5 2 9
Sample Output
14今天闲来无事 翻bzoj ranklist
发现一位叫xuruifan的神犇 不就前A掉了这题 决定写写看
(我才不会说是因为码长奇短呢)
刚开始看到期望 以为是一道逼格极高的数学题
读完题面 。。。
删除连续序列 维护一下前、后缀gcd就好了
枚举一下。。。O(n^2)虚了
翻了题解
由于一个数X最多区log次鬼吹灯就会变成1
所以 前、后缀鬼吹灯只有log种取值 所以分段枚举就好
整体复杂度O(nlogn)
落了点小细节 WA一发
#include<cmath> #include<ctime> #include<cstdio> #include<cstring> #include<cstdlib> #include<complex> #include<iostream> #include<algorithm> #include<iomanip> #include<vector> #include<string> #include<bitset> #include<queue> #include<set> #include<map> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f; } void print(ll x) {if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');} const int N=100100,mod=998244353; inline int gcd(int a,int b){return !b?a:gcd(b,a%b);} int f ,g ,a ,num ,pos ; int main() { int n=read(),cnt=0; register int i,j,k,st;ll ans=0; for(i=1;i<=n;++i)a[i]=read(); f[1]=a[1];for(i=2;i<=n;++i)f[i]=gcd(a[i],f[i-1]),ans+=f[i]; num[++cnt]=a ;pos[cnt]=n; g =a ;for(i=n-1;i;i--){g[i]=gcd(a[i],g[i+1]),ans+=g[i];if(g[i]!=g[i+1])num[++cnt]=g[i],pos[cnt]=i;} ans-=f +g[1];ans%=mod; for(i=1;i<n;i++) { j=i+2; for(k=1;k<=cnt;k++) { st=max(pos[k+1]+1,j); ans+=1ll*gcd(num[k],f[i])*(pos[k]-st+1);ans%=mod; if(st==j)break; } } print(ans);puts("");return 0; } /* 5 3 4 5 2 9 14 */
相关文章推荐
- bzoj 4921: 互质序列 数学+枚举
- 【gcd分块】BZOJ4921[互质序列]题解
- [数学+枚举]BZOJ 4921——互质序列
- [BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
- bzoj 4403: 序列统计 lucas定理+组合数学
- bzoj 4403: 序列统计【lucas+组合数学】
- 【BZOJ4403】序列统计(组合数学,卢卡斯定理)
- bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举
- prufer序列 图论?组合数学? BZOJ1430 小猴打架
- [BZOJ1430]小猴打架(prufer序列+数学相关)
- 【BZOJ4403】序列统计(组合数学,卢卡斯定理)
- [BZOJ1211][HNOI2004]树的计数(prufer序列+数学相关)
- Bzoj 4403: 序列统计 Lucas定理,组合数学,数论
- BZOJ-4403 序列统计 组合数学 + Lucas定理
- bzoj 1005: [HNOI2008]明明的烦恼 组合数学 + purfer序列
- BZOJ 4403: 序列统计 数学 lucas
- BZOJ 1046 DP 逆求最长下降序列+枚举
- [组合数学] BZOJ 4403 序列统计
- BZOJ-1045 糖果传递 数学+递推