首页 > 其他分享 >F. Expected Median(组合数学,模板)

F. Expected Median(组合数学,模板)

时间:2024-08-22 17:05:34浏览次数:4  
标签:int 个数 inv Median Expected c1 mod 模板 Mod

题目来源:https://codeforces.com/contest/1999/problem/F
//
题意:给长度为n的01字符串,求每个长度为k的子序列串(不连续)的中位数总和。
//
思路:n的范围为2e5,“我也不会非暴力求所有子序列啊”。先理解下什么是中位数吧,就是对于有序的中间数字,奇数就是(k+1)/2。也只有中位数是1的子序列才有贡献值。
用c0表示0的个数,c1表示1的个数,取1的个数为x,则取0的个数就是(k-x),当1的个数>=(k+1)/2的时候,中位数才是1。所以总贡献度等于 c1取x个1的总方案 * 在c0中取(k-x)的总方案,(组合数)。
这里就设计到了组合数的板子,快速幂求逆元,预处理:线性递推阶层逆元。(a/b)%Mod==(a(b^(mod-2)))%Mod,前提mod为质数。
组合数在x中取y个数: 【!x / !y * !(x-y)】 == 【!x * (!y^(Mod-2)) * (!(x-y)^(Mod-2))】 == 【f[x] * inv[y] * inv[x-y]】。
inv表示阶层逆元,inv[i]=f[i]^(mod-2),线性递推inv:inv[i]=(inv[i+1]
(i+1))//右到左递推
//
题解:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Mod=1e9+7;
const int N=2e5+5;
int f[N],inv[N];//f:阶层。inv:阶层逆元,inv[i]=f[i]^(mod-2)

int qower(int x,int y){
    int ans=1;
    while(y){
        if(y&1){ans=(ans*x)%Mod;}
        x=(x*x)%Mod;
        y/=2;
    }
    return ans%Mod;
}

void init(){//预处理阶乘,阶乘逆元
   f[0]=f[1]=1;
   for(int i=2;i<=N-5;i++){//预处理阶乘
       f[i]=(f[i-1]*i)%Mod;
   }
   inv[N-5]=qower(f[N-5],Mod-2);//线性递推阶乘逆元
   for(int i=N-6;i>=0;i--){
       inv[i]=(inv[i+1]*(i+1))%Mod;//inv[i]=f[i]^(mod-2)
   }
}

int C(int x,int y){//x中取y(x>=y)
  if(y>x){return 0;}
  return ((f[x]*inv[y])%Mod*inv[x-y])%Mod;// !x / !y * !(x-y)==!x * (!y^(Mod-2)) * (!(x-y)^(Mod-2))==f[x]*inv[y]*inv[x-y]
}

void solve(){
  int n,k,x;
  cin>>n>>k;
  int c0=0,c1=0;
  for(int i=1;i<=n;i++){
      cin>>x;
      if(x){c1++;}
      else{c0++;}
  }
  //当1的个数>=(k+1)/2的时候,就有1的贡献。1的数量为x,则0的数量为k-x
  //总贡献:在1的数量里取x的总方案 * 在0的数量里取(k-x)的总方案:(x,c1) * ((k-x),c0)
   int ans=0;
   for(int i=(k+1)/2;i<=k;i++){
     ans=(ans+(C(c1,i)*C(c0,k-i)%Mod))%Mod;
   }
   cout<<ans<<'\n';
}

signed main()
{
    init();
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

标签:int,个数,inv,Median,Expected,c1,mod,模板,Mod
From: https://www.cnblogs.com/yongchaoD/p/18374331

相关文章

  • 【生日视频制作】公园火车飞艇热气球AE模板修改文字软件生成器教程特效素材【AE模板】
    公园火车飞艇热气球生日视频制作教程AE模板修改文字特效软件生成器素材怎么如何做的【生日视频制作】公园火车飞艇热气球AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频......
  • 【生日视频制作】教师节中秋节国庆节小蛮腰广州塔心形照片AE模板修改文字软件生成器教
    广州塔心形照片生日视频制作教程AE模板改字特效软件生成器素材怎么如何做的【生日视频制作】教师节中秋节国庆节小蛮腰广州塔心形照片AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出......
  • WPF中如何使用后台代码动态创建数据模板(DataTemplate)
    数据模板回顾 在WPF中数据模板可以控制数据的呈现方式。对于一些简单的数据,例如一个string,一个int,在显示时,无须额外控制。但是对于复杂数据类型,就需要使用数据模板来控制数据的呈现方式。 一个很简单的例子假设我们定义了一个学生类1publicclassStudent2......
  • 如何使用排除法解决模板上的问题
    1.使用Firebug进行排查1.1简要介绍与安装方法Firebug是Firefox的一款插件,提供了一整套web开发所必需的工具。从HTML的编写,到CSS样式表的美化调优,以及…所以我们首先要安装Firefox浏览器。安装好浏览器后,选择菜单栏上的“工具”菜单,点击“附加组件”==>“获取附加组件”在输......
  • 【模板】单调栈
    洛谷P5788【模板】单调栈单调栈就是使栈内元素单调递增或者单调递减的栈,单调栈也只能在栈顶操作。做一个比喻,比方说:有个集训队招人,一个数代表了一个选手的能力值,先进来的选手年龄会比较大,后面的选手年龄比较小,但是这个集训队没有人数限制,那么如果遇到一个比你小还比你强的人那......
  • C++智能指针配合STL模板类
    代码 #include<unordered_map>#include<set>#include<memory>classResID{public:usingSP=std::shared_ptr<ResID>;ResID()=default;ResID(conststd::string&id,conststd::string&type):m_id(id......
  • Spring Boot实战:使用模板方法模式优化数据处理流程
    概述在软件开发过程中,我们经常需要处理各种各样的数据,这些数据可能来自不同的源,比如数据库、文件系统或者外部API等。尽管数据来源不同,但很多情况下处理这些数据的步骤是相似的:读取数据、清洗数据、转换数据格式、存储结果等。为了提高代码的复用性和可维护性,我们可以利用设计......
  • C++类模板案例-数组类封装
    #include<iostream>usingnamespacestd;template<classT>classMyArray{public: MyArray(intcapacity) { this->m_Capacity=capacity; this->m_Size=0; this->pAddress=newT[this->m_Capacity]; } ~MyArray() { if(th......
  • No qualifying bean of type 'feign' available: expected at least 1 bean which qua
    问题:刚用低代码平台引入的一个module,但是启动报错Exceptionencounteredduringcontextinitialization-cancellingrefreshattempt:org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'ServiceImpl'definedinfile[Ser......
  • 【Vue】模板语法
    系列文章目录第三章模板语法文章目录系列文章目录前言一、文本:二、显示原生的HTML三、属性绑定四、使用JavaScript表达式:五、条件判断:六、v-show和v-if:七、循环1.循环数组2.循环对象3.保持状态4.触发视图更新5.覆盖数组八、事件绑定1.基本使用2.传入event参......