题目

首先看到这个出现长度至少为\(2\)的回文子串

这就等价于不能出现两个连续且相同的字符

于是我们用概率生成函数来搞

设\(g_i\)表示\(i\)次操作后游戏没有结束的概率,\(f_{i,j}\)表示\(i\)次操作之后出现最后两个字符都是\(j\)的概率,这样的话游戏就结束了

再定义\(f_i=\sum_{j=1}^nf_{i,j}\)

我们要求的东西显然就是\(F'(1)\),即期望长度

那个非常有用的\(g_i=g_{i+1}+f_{i+1}\)还是成立的

于是

\[xG(x)+1=F(x)+G(x)
\]

代入\(x=1\),并两边求导

\[G(1)=F'(1)
\]

显然对于任意的\(F_i(x)\)都会存在

\[G(x)p_i^2x^2=F_i(x)p_ix+F_i(x)
\]

就是往一个非结束状态后面强塞两个字符\(i\),代入\(x=1\)就有

\[G(1)p_i^2=F_i(1)(1+p_i)
\]

\[F_i(1)=\frac{p_i^2}{1+p_i}G(1)
\]

又因为\(\sum_{i=1}^nF_i(1)=1\),于是\(\sum_{i=1}^n\frac{p_i^2}{1+p_i}G(1)=1\),于是答案就是

\[\frac{1}{\sum_{i=1}^n\frac{p_i^2}{1+p_i}}
\]

之后发现\(n\leq 10^7\),带\(log\)求逆元显然不是很可行了

于是离线求一下逆元就可以了,就像十二省联考里的D2T3那样就好了

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
const int mod=998244353;
const int maxn=1e7+5;
int n,ans;unsigned int seed;
int fac[maxn],p[maxn];
inline int Rand() {
seed=(seed<<2)^(seed>>5)^(seed<<7)^(seed>>11);return seed%mod;
}
inline int ksm(int a,int b) {
int S=1;
for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;
return S;
}
inline void Generate() {
scanf("%d%u",&n,&seed);
int sum=0;
for(re int i=1;i<n;++i)
p[i]=Rand(),sum=(sum+p[i])%mod;
p[n]=(mod+1-sum)%mod;
}
int main() {
Generate();fac[0]=1;
for(re int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*(p[i]+1)%mod;
int Inv=ksm(fac[n],mod-2),inv;
for(re int i=n;i;i--) {
inv=1ll*Inv*fac[i-1]%mod;
ans=(ans+1ll*p[i]*p[i]%mod*inv%mod)%mod;
Inv=1ll*Inv*(p[i]+1)%mod;
}
printf("%d\n",ksm(ans,mod-2));
return 0;
}

【牛客挑战赛31D】 雷的打字机的更多相关文章

  1. 牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp

    LINK:牛牛与序列 (牛客div1的E题怎么这么水... 还没D难. 定义一个序列合法 当且仅当存在一个位置i满足 $a_i>a_,a_j<a_$且对于所有的位置i,$1 \leq a_ ...

  2. 牛客挑战赛 30 A 小G数数

    题目链接:https://ac.nowcoder.com/acm/contest/375/A 分析:我写的时候竟然把它当成了DP....... 还建了个结构体DP数组,保存一二位,不知道当时脑子在抽啥 ...

  3. 良心送分题(牛客挑战赛35E+虚树+最短路)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...

  4. Luogu5611 Ynoi2013 D2T2/牛客挑战赛32F 最大子段和 分块、分治

    传送门 之前一直咕着的,因为一些特殊的原因把这道题更掉算了-- 有一个对值域莫队+线段树的做法,复杂度\(O(n\sqrt{n} \log n)\)然而牛客机子实在太慢了没有希望(Luogu上精细实现 ...

  5. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  6. 牛客挑战赛30D 小A的昆特牌(组合数学)

    题面 传送门 题解 很容易写出一个暴力 \[\sum_{i=l}^r {i+n-1\choose n-1}{s-i+m\choose m}\] 即枚举选了多少个步兵,然后用插板法算出方案数 我们对这个 ...

  7. 牛客挑战赛30-T3 小G砍树

    link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...

  8. 【牛客挑战赛30D】小A的昆特牌(组合问题抽象到二维平面)

    点此看题面 大致题意: 有\(S\)张无编号的牌,可以将任意张牌锻造成\(n\)种步兵或\(m\)种弩兵中的一种,求最后步兵数量大于等于\(l\)小于等于\(r\)的方案数. 暴力式子 首先我们来考虑 ...

  9. 牛客挑战赛14-F细胞

    https://www.nowcoder.com/acm/contest/81/F 循环卷积的裸题,太久没做FFT了,这么裸的循环卷积都看不出来 注意一下本文的mod 都是指表示幂的模数,而不是NTT ...

随机推荐

  1. C 终端输入 字符123 输出 10进制123

    #include <stdio.h> #define N 20 int main(int argc, const char *argv[]) { char a[N] = {'\0'}; i ...

  2. 清空资源管理器访问过FTP的账号、密码

    修改注册表,删除HKEY_CURRENT_USER\SOFTWARE\Microsoft\FTP\Accounts下相对应的项即可,即为xxx.xxx.xxx.xxx项. 如下图所示:

  3. Algo: Majority Element

    Approach #1 Brute Force Intuition    We can exhaust the search space in quadratic time by checking w ...

  4. Java中的常量池

    JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...

  5. 【JZOJ6346】ZYB和售货机

    description analysis 其实这个连出来的东西叫基环内向树 先考虑很多森林的情况,也就是树根连回自己 明显树根物品是可以被取完的,那么买树根的价钱要是儿子中价钱最小的那个 或者把那个叫 ...

  6. MySQL 其他基础知识

    -- 查询存储引擎show engines;-- 显示可用存储引擎show variables like 'have%'; -- concat多个字段联合select tname ,cname ,co ...

  7. hdu多校第二场 1005 (hdu6595) Everything Is Generated In Equal Probability

    题意: 给定一个N,随机从[1,N]里产生一个n,然后随机产生一个n个数的全排列,求出n的逆序数对的数量,加到cnt里,然后随机地取出这个全排列中的一个非连续子序列(注意这个子序列可以是原序列),再求 ...

  8. MFC文档视图结构学习笔记

    文档/视图概述 为了统一和简化数据处理方法,Microsoft公司在MFC中提出了文档/视图结构的概念,其产品Word就是典型的文档/视图结构应用程序 MFC通过其文档类和视图类提供了大量有关数据处理 ...

  9. 引用第三方 chalk 模块

    第三方模块没有默认引用到我们的电脑中,我们要进行下载 chalk 这个包是为了使输出不再单调,添加文字背景什么的,改变字体颜色什么的, npm install chalk //只需要写文件包名,不需要 ...

  10. 深入浅出写一个多级异步回调从基础到Promise实现的Demo

    今天一时兴起,写了一个渐进升级的异步调用demo,记录一下. 1. 最基础的同步调用 //需求:f2在f1之后执行,且依赖f1的返回值.如下: function f1(){ var s="1 ...