首页 > 其他分享 >浅谈容斥原理在计数中的应用

浅谈容斥原理在计数中的应用

时间:2024-03-13 22:12:14浏览次数:15  
标签:错位 浅谈 LL 容斥 kMaxN 计数 y1 sum

基本容斥

[ABC066D] 11

首先如果没有重复的数,答案肯定是 \(C_n^k\)。

考虑如何加入有重复的数这一性质。
不难想到用容斥思想,减去重复的部分。

那么考虑那些数列可能会重复:显然如果 \(x\) 出现了两次并且分别出现在 \(y1\),\(y2\),那么重复了的数列中一定不会出现下标在 \((y1,y2-1)\) 中(默认 \(y1<y2\)),所以就相当于在剩下的数中选出 \(k\) 个数。

code

[SDOI2016] 排列计数

首先考虑 \(m=0\)的情况,可以发现这个东西就是一个错位排列。

错位排列公式推导:

考虑容斥,不难想到用 \(n!\) 减去只有某个 \(i\) 使得 \(a_i=i\),再加上有两个数满足 \(a_i=i\),以此类推。

设 \(d_n\) 表示 \(n\) 的错位排列个数,所以得到式子:

\[d_n=n!+\sum_{i=1}^{n}{(-1)^i A_n^i} \]

然后进行化简:

\[d_n=n!+\sum_{i=1}^{n}{(-1)^i \frac{n!}{i!}} \]

\[d_n=n!+n!\sum_{i=1}^{n}{(-1)^i \frac{1}{i!}} \]

然后对于 \(d_i\) 维护与 \(d_{i-1}\) 的贡献差即可。

不过直接 dp 貌似更常用

然后就直接算出在 \(n\) 个数中选择 \(m\) 个数的方案,然后对于每个方案的代价就是将那 \(m\) 个数去掉后的错位排列数量。

code:

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

const int kMaxN = 1e6 + 5, kM = 1e9 + 7;

LL f[kMaxN] = {1}, p[kMaxN] = {1}, n, m, t;

LL P(LL x, LL y) {
  LL ans = 1;
  for (int i = 1; i <= y; i <<= 1, x = x * x % kM) {
    (y & i) && (ans = ans * x % kM);
  }
  return ans;
}

LL V(int x, int y) {
  return p[x] * P(p[y], kM - 2) % kM * P(p[x - y], kM - 2) % kM;
}

void C() {
  cin >> n >> m;
  cout << V(n, m) * f[n - m] % kM << "\n";
}

int main() {
  f[2] = 1;
  for (int i = 1; i < kMaxN; i++) {
    p[i] = p[i - 1] * i % kM;
  }
  for (int i = 3; i < kMaxN; i++) {
    f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % kM;
  }
  for (cin >> t; t; t--) {
    C();
  }
  return 0;
}

咕咕咕

标签:错位,浅谈,LL,容斥,kMaxN,计数,y1,sum
From: https://www.cnblogs.com/caoshurui/p/18071668

相关文章

  • 浅谈HTTP 和 HTTPS (中间人问题)
    前言由于之前的文章已经介绍过了HTTP,这篇文章介绍HTTPS相对于HTTP做出的改进开门见山:HTTPS是对HTTP的加强版主要是对一些关键信息进行了加密一.两种加密方式1.对称加密公钥+明文=密文密文+公钥=明文2.非对称加密举个例子就好比小区邮箱提供......
  • 浅谈Java中的String,StringBuffer与StringBuilder
    String,StringBuffer与StringBuilder类是我们比较常用的三个类,弄懂它们也是很重的,下面是我学习之后对这三个类的总结,欢迎评论纠错String类用法:1、String对象用于保存字符串,也就是一组字符序列2、字符串常量(如"Tom")对象是用双引号括起的字符序列。例如:“你好”、“12.2......
  • 浅谈JavaScript
    第一章JavaScript学前准备1.JavaScript简介(1)1992年Nombas的scriptease奠定了JavaScript思想理念;(2)受当时网速的限制,很多操作过程很漫长,如用户注册个账号,先提交到服务器去验证合法性,然后再返回给用户。Netscape发现了这个问题并开发了JavaScript语言,同时微软也开发了一个叫J......
  • 再谈格路计数
    众所周知,CCF不让再谈。不仅如此,CCF的论文集还存在诸多问题:不是我发给yyl的最新版,LGV处的图是错的。把目录删掉了有很丑的CCF水印因此在这里给出原论文为了证明格路计数是非常实用的知识点,我搜集了一些相关的题目。3不相交格路3.1行列式与PfaffianP10......
  • 浅谈有向无环图游戏
    以前写的,一直没发。浅谈有向无环图游戏在做题的时候,往往能遇到一些有关博弈论的游戏…公平组合游戏的解释在一般计算机竞赛中,博弈论的题目通常以“公平组合游戏ImpartialCombinatorialGame”的题干呈现给选手。所谓的公平组合游戏,定义如下:游戏有且仅有两个玩家,且游戏规......
  • 浅谈非内存对抗类和AI自瞄类FPS作弊程序原理及常用反反作弊措施与反作弊应对手段(上)
    一、引言    闲来无事,在浏览微信公众号的时候无意刷到了江西余江警方关于破获全国首例“AI自瞄”类外挂的案件,涉案金额达到惊人的3000余万。不得不感叹近年来AI相关科技发展之迅速及国内有关于FPS类及其他大类游戏作弊的黑产市场之大。    在工作学习之余,......
  • 统计数量(分块+二分)
    第1题   统计数量 查看测评数据信息给一个长度是n的正整数数组,a[1],a[2],a[3],...a[n-1],a[n],其中1<=a[i]<=1000。现在在数组a上进行m次操作:1.Mxyz,表示对a数组的闭区间[x,y]内所有a[i]的值分别加上z2.Axyzz,询问a数组闭区间[x,y]内有多少a[i]的值大于等于z......
  • 从keys命令出发-浅谈redis的字典和字典迭代器
    1.keys命令keys命令相信大家应该都用过,该命令会遍历整个redis的字典空间,对要查找的key进行匹配并返回。就像官方文档所说:在生产环境使用该方法的过程中要非常小心,因为redis服务器在执行该命令的时候其他客户端读写命令都会被阻塞。使用方法:KEYSpattern示例:127.0.0.1:6379......
  • 一类生成树计数问题。
    statement给定数列\(w_1,w_2\cdotsw_n,w_i\in[1,m]\),考虑一个\(n\)个点的图,节点\(i,j\)之间的边的个数为\(\sum\limits_{k=1}^ma_{k,w_i}b_{k,w_j}c_k\),你需要求出这个图的生成树个数。solution设度数矩阵为\(D\),邻接矩阵为\(G\),由矩阵树定理,我们要计算\(\det(D-G......
  • STM32标准库通用定时器计数
    STM32标准库通用定时器计数1.定时器初始化voidTIM2_Init(){ TIM_TimeBaseInitTypeDefTIM2_Initstructure;//定义结构体 NVIC_InitTypeDefNVIC_InitStructure;//定义结构体 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE......