4921: [Lydsy六月月赛]互质序列

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 188  Solved: 110
[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

5
3 4 5 2 9

Sample Output

14
 
 
发现本质就是选一个前缀(可以为空)和一个后缀(可以为空),使得前缀的末尾必须在后缀的开头的左边且不能相邻且前缀后缀元素个数>=2的前后缀gcd的和。
可以发现每个后缀的gcd都是a[n]的某个约数,并且gcd最多只有log种,因为每次gcd减小都伴随着至少一个质因子的失去。
所以我们就可以写暴力了,设r[i]为与i的后缀有相同gcd的最右后缀j,每次暴力统计就好了。
反正我是分成只有前缀(这时候不能只选a[1]),只有后缀(不能只选a[n]),还有前缀后缀都有的情况。
 
/**************************************************************
Problem: 4921
User: JYYHH
Language: C++
Result: Accepted
Time:308 ms
Memory:2460 kb
****************************************************************/ #include<bits/stdc++.h>
#define ll long long
#define maxn 100005
const int ha=998244353;
using namespace std;
int a[maxn],n,hz[maxn];
int r[maxn],qz=0,ans=0; inline int add(int x,int y){
x+=y;
while(x>=ha) x-=ha;
return x;
} int gcd(int x,int y){
return y?gcd(y,x%y):x;
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
hz[n+1]=0;
for(int i=n;i>1;i--){
hz[i]=gcd(a[i],hz[i+1]);
r[i]=(hz[i]==hz[i+1]?r[i+1]:i); //后缀
if(i<n) ans=add(ans,hz[i]);
} for(int i=1;i<n;i++){
qz=gcd(qz,a[i]);
//前缀
if(i>1) ans=add(ans,qz);
//前缀+后缀
if(qz==1) ans=add(ans,n-i-1);
else{
for(int j=i+2;j<=n;j=r[j]+1){
ans=add(ans,gcd(hz[j],qz)*(ll)(r[j]-j+1)%ha);
}
}
} printf("%d\n",ans);
return 0;
}

  

bzoj 4921: [Lydsy六月月赛]互质序列的更多相关文章

  1. 【bzoj4921】[Lydsy六月月赛]互质序列 暴力

    题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...

  2. [BZOJ 4921][Lydsy1706月赛]互质序列

    传送门 因为区间 gcd 的变换不会超过 log 个,所以我们可以暴力枚举区间起点,复杂度是 n*logn 的 #include <bits/stdc++.h> using namespa ...

  3. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  4. 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划

    [BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...

  5. 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并

    [BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  6. [BZOJ4920][Lydsy六月月赛]薄饼切割

    [BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...

  7. 数据结构_coprime_sequence(互质序列)

    coprime_sequence(互质序列) 问题描述 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3],[4,7,8],都是互质序列. [3,6,9]不是互质序列.现在 ...

  8. BZOJ4921「Lydsy1706月赛」互质序列

    吐槽一下BZOJ没有C++11  题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...

  9. bzoj 4974: [Lydsy八月月赛]字符串大师

    4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 371  Solved: 190[Submit][Statu ...

随机推荐

  1. Django之模型---ORM 多表操作

    多表操作 创建表模型 from django.db import models # Create your models here. class Author(models.Model): nid = ...

  2. NSNotificationCenter的用法

    作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter]  ...

  3. CSS效果小结

    效果属性 1.box-shadow(盒子阴影) 示例 加上 box-shadow 内阴影 复杂例子 阴影的形状跟原来的形状是一样的 结果: box-shadow 作用:1.营造层次感(立体感)2.充当 ...

  4. python小数据池,代码块深入剖析

    小数据池 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建更多的对象 缓存:int,str,bool int:缓存范围-5~256 str:    1.长度小于等于1,直接缓存 2.长度大于 ...

  5. clr(Windows 运行时和公共语言运行时)

    Windows 运行时   编译器使用 COM 引用计数机制来确定对象是否不再使用并可以删除. 因为从 Windows 运行时接口派生的对象实际上是 COM 对象,所以这是可行的. 在创建或复制对象时 ...

  6. studio rendering problems

    问题--------> Rendering Problems The following classes could not be instantiated: - android.support ...

  7. 剑指offer 面试题38

    面试题38:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 主要的思路是进 ...

  8. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  9. 【Luogu】P1430序列取数(DP)

    题目链接 博弈DP太喵了qwq 设f[i][j]表示剩下区间[i,j]要取,先手最大值 明显我们要从这区间里面拿个最大的 就等价于这段区间的前缀和,我们要给对手留下个最小的 就是f[i][j]=sum ...

  10. java面试题之BIO、NIO、AIO的应用场景

    定义: 1.BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时,服务器就启动一个线程来处理,如果这个连接不处理任何事情会造成不必要的线程开销,可以通过线程池机制改善. 2.NI ...