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

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;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8525848.html

时间: 2024-11-05 21:57:06

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

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

Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j. 请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树. Solution 思路比较直接 设 \(f[i][j]\) 表示\(i\)为子树的节点中,堆中最大值小于\(j\)的情况下能选的最多点数 转移时就是用一个前缀最大值更

数据结构_coprime_sequence(互质序列)

coprime_sequence(互质序列) 问题描述 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3],[4,7,8],都是互质序列. [3,6,9]不是互质序列.现在并不要求你找出一个互质序列,那样太简单了!真正的问题描述是:给定一个序列,删除其中一个元素使得剩下元素的 gcd 最大,输出这个 gcd. ★数据输入 输入第一行为一个正整数 n. 第二行为 n 个正整数 ai(1<=ai<=10^9).80%的数据 2<=n<=1000.100%的数

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

[BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j. 请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树. Input 第一行包含一个正整数n(1<=n<=200000),表示节点的个数. 接下来n行,每行两个整数v

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

[BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \times W\) 的长方形. tangjz 交给了 quailty 一根木棍,要求 quailty 将木棍轻轻放到桌面上.然后 tangjz 会以薄饼中心作为原点,将木棍绕着原点旋转一圈,将木棍扫过的部分切下来送给 quailty. quailty 已经放好了木棍,请写一个程序帮助他们计算 quailt

[BZOJ 4832][lydsy 4月赛] 抵制克苏恩

题面贴一发 [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 443  Solved: 164[Submit][Status][Discuss] Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的英雄,并且可以用牌 召唤至多 7 个随从帮助玩家攻击

【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp

题目描述 给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度. 输入 第一行包含一个正整数n(1<=n<=300),表示括号序列的个数. 接下来n行,每行一个长度在[1,300]之间的括号序列,仅由小括号构成. 输出 输出一行一个整数,即最大长度,注意你可以一个序列也不选,此时长度为0. 样例输入 3 ()) ((() )() 样例输出 10 题解 贪心+背包dp 首先对于一个括号序列,有用的只有:长度.消耗'('的数目.以及'('减去

【BZOJ4919】[Lydsy六月月赛]大根堆

题解: 首先裸的dp很好想 f[i][j]表示在i点,最大值<=j的点数最大值 看了别人的题解知道了可以用线段树合并来优化这个东西.. 我们考虑对于每个点,首先我们要合并它的子树 其实就是对于相同位置的点相加即可 然后考虑当前节点,我们应用f[v[x]-1]+1去更新v[x]-n之间的值(也就是取max操作) 然后取max这个东西是可以标记永久化的 原文地址:https://www.cnblogs.com/yinwuxiao/p/9060320.html

HDU5668 Circle 非互质中国剩余定理

分析:考虑对给定的出圈序列进行一次模拟,对于出圈的人我们显然可以由位置,编号等关系得到一个同余方程 一圈做下来我们就得到了n个同余方程 对每个方程用扩展欧几里得求解,最后找到最小可行解就是答案. 当然不要忘了判无解的情况. 有非常多选手似乎都是一眼标算然后写挂了,对此表示很遗憾,但是此题确实是比较容易写挂的... 注:中国剩余定理 解模线性方程组的时候 有两种情况 1:一种是模数是两辆互质的,这样的题可以用LRJ白书上的模板,俗称CRT1 2:模数存在不互质的,这样的需要用合并方程的做法,俗称C

BestCoder Round #80 1004 hdu 5668 中国剩余定理(m不互质版)

链接:戳这里 Circle Time Limit: 2000/1000 MS (Java/Others)   Memory Limit: 65536/65536 K (Java/Others) 问题描述 \ \ \ \     Fye对约瑟夫游戏十分着迷. \ \ \ \     她找到了n个同学,把他们围成一个圈,让他们做约瑟夫游戏,然后她得到了一个同学们出圈的编号序列.游戏是这样进行的:以同学1为起点,开始计数,计数到第k个同学,该同学出圈.出圈的同学将不参与之后的计数. \ \ \ \