首页 > 其他分享 >P3600 随机数生成器

P3600 随机数生成器

时间:2022-10-07 21:47:56浏览次数:48  
标签:return int max 生成器 ge P3600 随机数 inline Mod

首先转化为求 \(\displaystyle \sum_{k\ge 1}P( \max_{i} \{ \min_{l_i \le j \le r_i}a_j \} \ge k)\)

注意到右端点同为 \(i\) 的区间只有左端点最大的区间贡献答案,记其左端点为 \(l_i\)

方向1. 直接计算

记 \(p\) 表示填一个 \(\ge k\) 的数的概率,

记 \(f_{i,j}\) 表示前 \(i\) 个数,连续 \(j\) 个数的值 \(\ge k\) 的概率,有

\[f_{i,j}=\begin{cases} (1-p)\sum_{l=0}^{i-1}f_{i-1,l} & j=0 \\ p f_{i-1,j-1} & j \not= 0 \end{cases}\]

当 \(l_i \ge i-j+1\) 时贡献答案并将 \(f_{i,j}\) 置 \(0\)

复杂度 \(\mathcal O(n^3)\)

方向2. 反向计算

注意到 \(\max \ge k\) 并不好计算,我们计算其补集 \(\max < k\),也就是每个区间的 \(\min<k\)

记 \(f_{i,j}\) 表示前 \(i\) 个数,上一个 \(<k\) 的位置为 \(j\) 的概率,有

\[f_{i,j}=\begin{cases} 0 & j < l_i \\ pf_{i-1,j} & j \ge l_i ,j \not= i \\ (1-p)\sum_{l=0}^{i-1}f_{i-1,l} & j=i \end{cases}\]

此时的转移没有移位,也就是说 \(j \ge \max_{k \le i}l_k\) 时 \(f\) 不为 \(0\)

那么维护 \(f\) 的和即可,复杂度 \(\mathcal O(n^2)\)

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

const int MAXN = 2000 , Mod = 666623333;
inline int Add( int x , int y ) { x += y; return x >= Mod ? x - Mod : x; }
inline int Sub( int x , int y ) { x -= y; return x < 0 ? x + Mod : x; }
inline int Mul( int x , int y ) { return 1ll * x * y % Mod; }
inline int Qkpow( int x , int po ) { int p = 1; for( ; po ; po >>= 1 , x = Mul( x , x ) ) if( po & 1 ) p = Mul( p , x ); return p; }
inline int Inv( int x ) { return Qkpow( x , Mod - 2 ); }

int n , m , q , l[ MAXN + 5 ];
int pw[ MAXN + 5 ] , f[ MAXN + 5 ];

int main( ) {
    scanf("%d %d %d",&n,&m,&q);
    for( int i = 1 , ql , qr ; i <= q ; i ++ ) {
        scanf("%d %d",&ql,&qr);
        l[ qr ] = max( l[ qr ] , ql );
    }

    int ans = 0;
    for( int k = 1 ; k <= m ; k ++ ) {
        int p = Mul( m - k + 1 , Inv( m ) );
        pw[ 0 ] = 1;
        for( int i = 1 ; i <= n ; i ++ ) pw[ i ] = Mul( pw[ i - 1 ] , p );

        f[ 0 ] = 1; int sf = 1;
        for( int i = 1 , mxl = -1 ; i <= n ; i ++ ) {
            f[ i ] = Mul( Sub( 1 , p ) , sf );
            for( int j = mxl + 1 ; j < l[ i ] ; j ++ ) sf = Sub( sf , Mul( f[ j ] , pw[ i - j ] ) ); 
            mxl = max( mxl , l[ i ] - 1 );
        }
        ans = Add( ans , Sub( 1 , sf ) );
    }
    printf("%d\n", ans );
    return 0;
}

标签:return,int,max,生成器,ge,P3600,随机数,inline,Mod
From: https://www.cnblogs.com/chihik/p/p3600.html

相关文章

  • 推荐一款id生成器: Hashids
    唯一id生成的方式有很多种,比较常见的有以下几种方式:语言自带功能,如Java中的UUID,常用于后端第三方工具提供,如npm中的nanoid,常用于前端Twitter开源的Snow......
  • 结构化 SQL 生成器
    https://github.com/liyupi/sql-generator在线使用:http://sql.yupi.icu/项目介绍视频:https://www.bilibili.com/video/BV1qa411J7vh/......
  • 纯随机数生成器
      package demo; import java.util.Scanner; public class Demo{    public static void main(String[]args){              ......
  • C语言:随机数产生 指定范围内随机整数的产生:(a-b) (0-99)
    #include<stdio.h>main(){inta,b,c;for(a=1;a<110;a++)printf("%d",rand()%10);getchar();}第一次运行:  第二次运行:  结果相同......
  • qt5--QRandomGenerator随机数类
     win.h#ifndefWIN_H#defineWIN_H#include<QWidget>#include<QRandomGenerator>//随机数类#include<QDebug>classWin:publicQWidget{Q_OBJE......
  • 使用 JavaScript 和 CSS 的随机颜色生成器
    在线演示地址:​​https://haiyong.site/tools/color-generator.html​​​源码也可在文末免费获取✨项目基本结构目录结构如下:├──css│└──style.css├──js......
  • MybatisPlus学习之MyBatisX插件比代码生成器还好用的哦2
    MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表联查,我们就需......
  • C语言入门—明明的随机数
    题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的......
  • MybatisPlus学习之MyBatisX插件比代码生成器还好用的哦
    一、MyBatisX的作用:1.​​xml​​​跳转2.生成代码3.重置代码4.JAP提示跟代码生成器比较:代码生成器生成文件还有controller等文件,而mybatsx没有,但是代码生成器生成的mapper......
  • Mybatis plus代码生成器
    案例一demo为​​chenx/mybatisplus-demo​​​​参考​​​​案例​​项目初始结构数据库新建表项目配置启动CodeGenerator类中的main方式,输入表名,生成代码案例二demo为​......