穿越万年的轮回[期望dp]

news2024/9/29 3:24:53

在这里插入图片描述
首先我们设置 d p i , 0 / 1 , 0 / 1 dp_{i,0/1,0/1} dpi,0/1,0/1表示经过 i i i次操作之后开头为 r e d / e d r red/edr red/edr,结尾为 r e d / e d r red/edr red/edr的串的期望 r e d red red字符串个数。
然后我们考虑转移:
首先我们要来思考一下期望的本质,这样一个状态,我们以 d p i , 0 , 0 dp_{i,0,0} dpi,0,0为例,里面可能有很多种情况,比如串 " r e d r e d " "redred" "redred"和串 " r e d e d r r e d " "rededrred" "rededrred"每一种有一个概率和贡献,假设有 n n n种情况,每一种的概率是 p i p_i pi,贡献是 X i X_i Xi,那么
d p i , 0 , 0 = ∑ i = 1 p i X i dp_{i,0,0}=\sum_{i=1}p_iX_i dpi,0,0=i=1piXi
那么我们考虑在这个状态后面接上一个 " r e d " "red" "red"串,也就是第一种操作,这里面的串的概率和贡献会如何变化呢?
对于上述的一个状态 p i X i p_iX_i piXi,加上一个 " r e d " "red" "red"串之后贡献 X i X_i Xi变为 X i + 1 X_i+1 Xi+1,概率 P i P_i Pi变为 P i 3 \frac{P_i}{3} 3Pi所以这样一种转移让
d p i + 1 , 0 , 0 + = ∑ i = 1 p i 3 ( X i + 1 ) = ∑ i = 1 p i X i 3 + ∑ i = 1 p i 3 dp_{i+1,0,0}+=\sum_{i=1}\frac{p_i} {3} (X_i+1)=\sum_{i=1}\frac{p_iX_i} {3}+\sum_{i=1}\frac{p_i} {3} dpi+1,0,0+=i=13pi(Xi+1)=i=13piXi+i=13pi
所以我们再记录一个 p i , 0 / 1 , 0 / 1 p_{i,0/1,0/1} pi,0/1,0/1表示经过 i i i次操作之后开头为 r e d / e d r red/edr red/edr,结尾为 r e d / e d r red/edr red/edr的串的概率,即可转移。
第二种操作和第三种操作同理可以得到:
对于四种情况各自分类讨论即可。但值得注意的是空串不在我们的考虑范围内,得提出来单独计算。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mod=1e9+7;
ll poww(ll a,ll b){
    ll t=1;
    while(b){
        if(b&1)t=t*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return t;
}
void add(int &a,int b){
    a+=b;
    if(a>=mod)a-=mod;
}
void del(int &a,int b){
    a-=b;
    if(a<0)a+=mod;
}
const int M=2e5+50;
int dp[M][2][2];
int P[M][2][2];

int main()
{
    int k;
    scanf("%d",&k);
    //P[0][0][0]=1;
    int inv3=poww(3,mod-2);

    int P0=1;
    for(int i=0;i<k;i++){
        //printf("%d %d %d %d\n",P[i][0][0],P[i][0][1],P[i][1][0],P[i][1][1]);

        {
            add(dp[i+1][0][0],1ll*P0*inv3%mod);
            add(P[i+1][0][0],1ll*P0*inv3%mod);

            if(i>=1){
                add(dp[i+1][1][0],1ll*inv3*P0%mod);
                add(P[i+1][1][0],1ll*P0*inv3%mod);

                add(dp[i+1][1][1],1ll*inv3*P0%mod);
                add(P[i+1][1][1],1ll*P0*inv3%mod);

                add(dp[i+1][1][1],1ll*9*inv3%mod*P0%mod);
                add(P[i+1][1][1],1ll*P0*inv3%mod);
            }

            P0=1ll*P0*inv3%mod;
        }



        // red...red
        add(dp[i+1][0][0],((1ll*dp[i][0][0]*inv3%mod)+1ll*P[i][0][0]*inv3%mod)%mod);
        add(P[i+1][0][0],1ll*P[i][0][0]*inv3%mod);

        add(dp[i+1][0][1],1ll*dp[i][0][0]%mod*inv3%mod);
        add(P[i+1][0][1],1ll*P[i][0][0]*inv3%mod);

        add(dp[i+1][0][0],10ll*dp[i][0][0]%mod*inv3%mod);
        add(P[i+1][0][0],1ll*P[i][0][0]*inv3%mod);



        // red..edr dp[0][1]

        add(dp[i+1][0][0],((1ll*dp[i][0][1]*inv3%mod)+1ll*P[i][0][1]*inv3%mod)%mod);
        add(P[i+1][0][0],1ll*P[i][0][1]*inv3%mod);


        add(dp[i+1][0][1],((1ll*dp[i][0][1]*inv3%mod)+1ll*P[i][0][1]*inv3%mod)%mod);
        add(P[i+1][0][1],1ll*P[i][0][1]*inv3%mod);

        add(dp[i+1][0][1],(1ll*(10ll*dp[i][0][1])%mod*inv3%mod));
        add(P[i+1][0][1],1ll*P[i][0][1]*inv3%mod);


        // edr red dp[1][0]

        add(dp[i+1][1][0],((1ll*dp[i][1][0]*inv3%mod)+1ll*P[i][1][0]*inv3%mod)%mod);
        add(P[i+1][1][0],1ll*P[i][1][0]*inv3%mod);

        add(dp[i+1][1][1],1ll*(dp[i][1][0])*inv3%mod);
        add(P[i+1][1][1],1ll*P[i][1][0]*inv3%mod);

        add(dp[i+1][1][0],1ll*(10ll*dp[i][1][0])%mod*inv3%mod);
        add(P[i+1][1][0],1ll*P[i][1][0]*inv3%mod);



        // edr edr dp[1][1]
        add(dp[i+1][1][0],((1ll*dp[i][1][1]*inv3%mod)+1ll*P[i][1][1]*inv3%mod)%mod);
        add(P[i+1][1][0],1ll*P[i][1][1]*inv3%mod);

        add(dp[i+1][1][1],((1ll*dp[i][1][1]*inv3%mod)+1ll*P[i][1][1]*inv3%mod)%mod);
        add(P[i+1][1][1],1ll*P[i][1][1]*inv3%mod);

        add(dp[i+1][1][1],((10ll*dp[i][1][1]%mod*inv3%mod)+9ll*P[i][1][1]%mod*inv3%mod)%mod);
        add(P[i+1][1][1],1ll*P[i][1][1]*inv3%mod);


    }
    int ans=0;
    add(ans,dp[k][0][0]);
    add(ans,dp[k][0][1]);
    add(ans,dp[k][1][0]);
    add(ans,dp[k][1][1]);
    printf("%d",ans);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「Python|VS Code」如何在VS Code中使用Jupyter Notebook运行Python代码

本文主要介绍如何在VS Code安装Jupyter Notebook的扩展并创建notebook文件&#xff0c;并在notebook中运行python代码。同时&#xff0c;介绍使用Jupyter notebook运行python代码的好处。 文章目录安装Jupyter notebook扩展并运行代码Jupyter notebook的好处安装Jupyter notebo…

第十章 STM32F103+ESP8266接入机智云 实现小型IOT智能家居项目

前言 最近有不少小伙伴私信留言&#xff0c;想要我推出一章能够通过APP进行远程控制并获取传感器信息的实验教程。说实话在嵌入式毕设里边&#xff0c;这算是中等偏上水平的了。刚好我也有兴趣写写。全篇4700多字&#xff0c;我写的很详细&#xff0c;按着文章一步一步操作即可…

RabbitMQ的基础学习(上)

前言&#xff1a; RabbitMQ是一个基于AMQP规范实现的消息队列。它具有性能好、高可用、跨平台性、社区活跃等优点&#xff0c;比较适合中小型公司使用。掌握RabbitMQ相关知识&#xff0c;对工作和学习都有帮助。下面我讲详细介绍一下Rabbit的相关知识。 正文&#xff1a; 一、…

【机器学习】缺失值的处理方法总结

目录&#xff1a;缺失值的处理一、总录二、引言三、数据缺失的原因四、数据缺失的类型五、数据缺失的处理方法5.1 删除记录5.2 数据填充5.2.1 替换缺失值5.2.2 拟合缺失值5.2.3 虚拟变量5.3 不处理六、实证演练七、小结一、总录 二、引言 业界广泛流传这样一句话&#xff1a;数…

java构造器2023021

构造器&#xff1a; 构造器是一个特殊的方法&#xff0c;用于创建实例时执行初始化。构造器是创建对象的重要途径&#xff08;即使使用工厂模式、反射等方式创建对象&#xff0c;其实质依然是依赖于构造器&#xff09;&#xff0c;因此Java类必须包含一个或一个以上的构造器。 …

23种设计模式(十五)——适配器模式【接口隔离】

文章目录 意图什么时候使用适配器真实世界类比适配器模式的实现适配器模式的优缺点亦称:封装器模式、Wrapper、Adapter 意图 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。 什么时候使用适配器 1、系统需要使用现有的类,而这…

软件设计到底是什么?

软件设计是什么&#xff1a; 就是讨论要用什么技术实现功能&#xff1f;就是要考虑选择哪些框架和中间件&#xff1f;设计就是设计模式&#xff1f;设计就是Controller、Service加Model&#xff1f;…… 一百个程序员&#xff0c;就有一百种理解。若按照这些方式去了解“软件…

Java设计模式中状态模式介绍/状态模式怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.6 状态模式 6.6.1定义 对有状态的对象&#xff0c;把复杂的"判断逻辑"提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变…

【C++】哈希表 | 闭散列 | 开散列 | unordered_map 和 unordered_set 的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;unordere…

Ubuntu20.04/22.04 安装 Arduino IDE 2.x

这周收到两片基于LGT8F328P LQFP32的Arduino Mini EVB, 机器上没有 Arduino 环境需要新安装, 正好感受一下新出的 Arduino IDE 2.x, 记录一下 Ubuntu 20.04/22.04 下安装 Arduino IDE 2.x 的过程. 下载解压 下载 访问 Arduino 的官网下载 https://www.arduino.cc/en/softwar…

2021-04-12

今天在练习自定义标题栏&#xff08;Android初级开发&#xff08;四&#xff09;——补充3&#xff09;的过程中遇到了隐藏系统自带标题栏的问题&#xff0c;现将几种去掉系统自带标题栏的方式做一总结。大体上可以分为两种方式&#xff0c;一种是修改xml文件&#xff08;这种方…

第六层:继承

文章目录前情回顾继承继承的作用继承的基本语法继承方式公共继承保护继承私有继承继承中的对象模型继承中的构造和析构顺序继承中同名成员访问非静态成员静态成员多继承语法注意多继承中的对象模型多继承父类成员名相同菱形继承概念菱形继承出现的问题虚继承步入第七层本章知识…

【数据分析】(task3)数据重构

note 数据的合并&#xff1a;df自带的join方法是横向合并&#xff0c;append方法是纵向&#xff08;上下&#xff09;合并拼接&#xff1b;pd的merge方法是横向合并&#xff0c;然后用刚才的apend进行纵向合并。数据的重构&#xff1a;stack函数的主要作用是将原来的列转成最内…

Redis基本类型和基本操作

2.Redis常见命令 Redis是典型的key-value数据库&#xff0c;key一般是字符串&#xff0c;而value包含很多不同的数据类型&#xff1a; Redis为了方便我们学习&#xff0c;将操作不同数据类型的命令也做了分组&#xff0c;在官网&#xff08; https://redis.io/commands &…

阿里云轻量服务器下>安装宝塔面板>安装使用Tomcat服务器>通过公网ip地址>直接访问网站目录下文件

第一步 阿里云开放Tomcat 8080端口号 和宝塔面板 8888端口 第二步 如果你的应用镜像 一开始在阿里云购买服务器时候没有选择宝塔应用镜像 先打开如下界面 将系统中应用镜像 确定更换为 宝塔面板镜像 第三步 请在应用详情中 走完紫色所框选的步骤 第四步 将上一步获取到的…

cadence SPB17.4 - allegro - align component by pin

文章目录cadence SPB17.4 - allegro - align component by pin概述笔记实验备注补充 - 2023_0120_2337ENDcadence SPB17.4 - allegro - align component by pin 概述 allegro自带的元件对齐, 默认是对齐元件中心的, 对齐后的效果是中心对齐. 但是为了走线能走的最短, 拉线方便…

2023年春节祝福第二弹——送你一只守护兔(下),CSS3 动画相关属性图例实例大全(82种),守护兔源代码免费下载

2023年春节祝福第二弹——送你一只守护兔(下&#xff09; CSS3 动画相关属性图例实例大全&#xff08;82种&#xff09;、守护兔源代码免费下载 本文目录&#xff1a; 五、CSS3 动画相关属性实例大全 &#xff08;1&#xff09;、CSS3的动画基本属性 &#xff08;2&#xf…

TCP/IP OSI七层模型

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.OSI七层模型 1.什么是OSI七层参考模型 2.七层每层分别的作用…

Spring热部署设置

手动热部署 热部署是指在不停止应用程序的情况下更新应用程序的功能。这样可以避免短暂的服务中断&#xff0c;并且可以更快地部署新的功能和修复问题。热部署通常适用于Web应用程序和服务器端应用程序。 在pom.xml中添加依赖&#xff1a; <dependency><groupId>…

cmake 02 hello_cmake

cmake 学习笔记 一个最小化的 cmake 项目 目录结构 F:\2023\code\cmake\hello_cmake>tree /f 卷 dox 的文件夹 PATH 列表 卷序列号为 34D2-6BE8 F:. │ CMakeLists.txt │ main.cpp │ └─.vscodelaunch.jsontasks.jsonF:\2023\code\cmake\hello_cmake>源码 main.c…