首页 > 其他分享 >[ARC132E] Paw

[ARC132E] Paw

时间:2023-12-12 22:59:25浏览次数:38  
标签:typedef ch ARC132E Paw ll long 箭头 一段

最终状态自左至右一定形如 <<<===>>> ,即中间有一段和原序列相等,左边都是左箭头,右边都是右箭头的形式。

证明考虑如果要保留原序列 \([l,r]\) 一段(显然 \([l,r]\) 中不含 .),那么设位于 \(l\) 以左且距 \(l\) 最近的前两个点为 \(i,j\)(满足 \(i>j\)),如果操作方案中 \(i\) 位于 \(j\) 之前,\(i\) 只能向左走,这样 \(j\) 就成了最近的点且有一段合法后缀,反之如果 \(i\) 在 \(j\) 之后,那么 \(j\) 的操作对合法性没有任何影响。所以最终必然只能形成一段左箭头组成的前缀,后缀同理。

于是我们只需要枚举不变的连续段(对于不存在的情况可以通过在串首尾加 . 来解决),这样前后就是两个独立且等价的问题。对于左面,即是求随机操作至结束不触碰右边界的概率,右边的问题与之对称。

注意到概率实际只与 . 的个数相关,不妨设 \(f_i\) 为上述问题在 . 个数为 \(i\) 时的答案,则有 \(f_i=f_{i-1} \times (1-\frac{1}{2i})\)。式子的意义是除去第一次就触碰边界的情况,其余情况都能递归到下一层。而每种情况被递归到的概率是相等的

代码实现
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
inline ll read() {
	ll x=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
const ll N=1e5+5,p=998244353;
int n,pre[N],L[N],R[N],cnt;
ll inv[N],f[N];
string s;
void init() {
	inv[0]=inv[1]=f[0]=1;
	for(int i=2;i<=n;i++) inv[i]=(p-p/i)*inv[p%i]%p;
	for(int i=1;i<=n;i++) f[i]=f[i-1]*(p+1-inv[2]*inv[i]%p)%p;
}
int main() {
    n=read(),cin>>s;s+=".";s="."+s;
    init();int lst=-1;
    for(int i=0;i<=n+1;i++) {
    	pre[i]=pre[i-1]+(s[i]=='<'); 
    	if(s[i]=='.') {
    		if(lst!=-1) L[++cnt]=lst,R[cnt]=i;
    		lst=i;
		}
	}
	ll ans=0;
	for(int i=1;i<=cnt;i++) (ans+=1ll*(pre[R[i]]-pre[L[i]]+L[i])*f[i-1]%p*f[cnt-i]%p)%=p;
	cout<<ans<<'\n';
	return 0;
}

标签:typedef,ch,ARC132E,Paw,ll,long,箭头,一段
From: https://www.cnblogs.com/Hypercube07/p/17898036.html

相关文章

  • [ARC132E] Paw
    题目链接考虑最后形态,一定是有某一个区间\([l,r]\)保持初始的样子,\(l\)前面都是<,\(r\)后面都是>。这个区间一定是某两个相邻圆点的位置。设\(f_i\)为前\(i\)个数全部被覆盖成<的概率。设\(x\)为\(l\)前面圆点的数量,\(y\)为\(r\)后面圆点的数量,那么区间\([l......
  • 无涯教程-Erlang - spawn函数
    这用于创建新进程并对其进行初始化。spawn-语法spawn(Function)Function - 需要产生的功能。spawn-返回值此方法返回一个进程ID。-module(helloLearnfk).-export([start/0]).start()->spawn(fun()->server("Hello")end).server(Message)->io:f......
  • 【DevEco Studio】报错Error: spawn cmd.exe ENOENT怎么解决?
    ​【关键字】hvigor报错、Error:spawncmd.exeENOENT 【问题背景】编译的时候报Error:spawncmd.exeENOENT该怎么解决?预览的时候报Error:spawncmd.exeENOENT该怎么解决?具体报错截图如下:​​ 【解决方案】这种是环境变量缺少了C:\Windows\System32导致的,在Path......
  • 【DevEco Studio】报错Error: spawn cmd.exe ENOENT怎么解决?
    【关键字】hvigor报错、Error:spawncmd.exeENOENT【问题背景】编译的时候报Error:spawncmd.exeENOENT该怎么解决?预览的时候报Error:spawncmd.exeENOENT该怎么解决?具体报错截图如下:【解决方案】这种是环境变量缺少了C:\Windows\System32导致的,在Path里面新建一个把值复制进......
  • [Mac软件]HitPaw Video Converter 功能强大的视频格式转换编辑软件激活版
    软件介绍:以令人难以置信的速度将无损视频和音乐转换为1000多种格式:MP4、MOV、AVI、VOB、MKV等。不仅适用于普通编解码器,也适用于高级VP9、ProRes和Opus编码器。这解决了您不支持格式的所有问题,并允许您在任何平台和设备上播放视频。从10,000多个网站下载和保存视频,包括YouTube、Bil......
  • Unreal入门,通过蓝图自定义Pawn移动
    1.自定义Pawn新建Pawn添加相机和网格体网格体设置(新建项目自带资源里随便挑一个)相机设置(主要是旋转和位移,随便设置下,大概能达到俯视效果就行,其它效果也可以,只要能看到自己的Pawn,不然不知道怎么动的)2.应用自定义Pawn(默认GameMode不可编辑,不能直接替换Default......
  • python多进程:fork模式和spawn模式
    python多进程:fork模式和spawn模式fork模式1.仅unix系统支持,并且是unix系统的默认模式.2.使用该模式创建子进程的时候,会复制父进程的全部变量,支持传参(任意类型)给子进程,但是不会复制父进程的线程.3.该模式相当于将父进程的内存复制一份用于创建子进程.但是由于不复制线程......
  • Nodejs 命令行调用 exec 与 spawn 差异
    Nodejs命令行调用exec与spawn差异比如在前端工程项目中Nodejs要调用命令行命令如:yarnelectron:buildexec调用yarn命令,为了能使命令行能实时打印输出正在编译的命令以异步形式调用exec使用stdout.on方式监听标准输出,并打印//打包electronconstbuildEl......
  • Node.js child_process spawn All In One
    Node.jschild_processspawnAllInOneNode.js多线程//const{spawn}=require('child_process');const{spawn}=require('node:child_process');//$ls-al/usr等价于constls=spawn('ls',['-lh','/usr�......
  • nodejs 使用exec ,execFile,spawn运行子进程区别,以及如何正确的的关闭子进程
    exec,execFile,spawn都是运行一个子进程,但是在不同的操作系统上用法和表现有很大差异。linux/unixexec运行子进程需要创建一个终端环境(命令行窗口),然后在其中运行命令,execFile则不需要,因此在linux/unix上,execFile的效率更高。windows在windows平台上,运行脚本程序(如批处理.bat)必须有......