首页 > 其他分享 >[SDOI2016] 排列计数(组合数学)

[SDOI2016] 排列计数(组合数学)

时间:2024-11-18 18:50:18浏览次数:3  
标签:排列 return int res 计数 SDOI2016 ans 错排 mod

题目传送门

解题思路

可以先想想满足题目的序列是如何构造的?

1. 先从 n 个位置里选 m 个位置,使得这些位置上的 a_i=i,方案数为 C_n ^m

2. 再将剩下的数错排。

于是,这又扯到了错排问题。

我们可以设 d(i) 表示将 i 个元素错排的方案数。

我们可以将第 i 个数放在其他 i-1 个位置,剩余的错排;

也可以将第 i 个数与另外的 i-1 个数互换位置,剩余的错排;

所以最终得到:d(i)=(i-1)*(d(i-1)+d(i-2))

方案数为 C_n^m \times d(n-m)

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int q;
int f[1000001];
int g[1000001];
int mod=1e9+7;
int d[1000001];

int qpow(int a,int b)
{
	int res=1;
	while(b)
	{
		if(b&1)
		{
			res*=a;
			res=(res+mod)%mod;
		}
		a*=a;
		a=(a+mod)%mod;
		b/=2;
		b=(b+mod)%mod;
	}
	return res%mod;
}
void init()
{
	f[0]=1;
	g[0]=1;
	d[2]=1;
	d[0]=1;
	for(int i=1;i<=1000000;i++)
	{
		f[i]=f[i-1]*i;
		f[i]=(f[i]+mod)%mod;
		g[i]=g[i-1]*qpow(i,mod-2)%mod;
		g[i]=(g[i]+mod)%mod;
		
	}
	for(int i=3;i<=1000000;i++)
	{
		d[i]=(i-1)%mod*(d[i-1]+d[i-2])%mod;
		d[i]=(d[i]+mod)%mod;
	}
}

int c(int n,int m)
{
	if(m>n)return 0;
	return f[n]%mod*g[m]%mod*g[n-m]%mod;
}
signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	
	init();
	scanf("%lld",&q);
	int n,m;
	int ans;
	while(q--)
	{
		scanf("%lld%lld",&n,&m);
		ans=c(n,m);
		ans=(ans+mod)%mod;
		ans=ans*d[n-m]%mod;
		ans=(ans+mod)%mod;
		printf("%lld\n",ans);
	}
	return 0;
}

标签:排列,return,int,res,计数,SDOI2016,ans,错排,mod
From: https://blog.csdn.net/2403_87021226/article/details/143864145

相关文章

  • 老子的全排列呢
    老子的全排列呢题目描述老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么?输入描述无输出描述1~8的全排列,按照全排列的顺序输出,每行结尾无空格。示例1输入No_Input......
  • Java虚拟机JVM-程序计数器 讲解
    目录Java8的JVM内存结构程序计数器的功能程序技术器的具体细节class文件的字节码视图的内容程序计数器的特性Java8的JVM内存结构程序计数器的功能记录每个线程正在执行的字节码指令的地址,帮助JVM确定下一条需要执行的指令。程序技术器的具体细节class文件的......
  • 字节青训营 相邻字母匹配计数问题
    问题描述小F有一个由大写字母和小写字母组成的字符串。她想知道,在忽略字母大小写的情况下,有多少对相邻的字母是相等的。例如,对于字符串 "aABbbC",在忽略大小写的情况下,有3对相邻字母是相等的,分别是 "aA","AB" 和 "bb"。测试样例样例1:输入:s="aABbbC"输出:3样例2:......
  • LeetCode【0046】全排列
    本文目录1中文题目2求解方法:回溯法2.1方法思路2.2Python代码2.3复杂度分析3题目总结1中文题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。可以按任意顺序返回答案。示例:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,......
  • 代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetc
    1leetcode491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili思路:用之前的方法,结果翻车了,好好看视频学新技能吧1.1视频后的思路真的没想到用set来去重,还是基......
  • YOLOV8应用|排球垫球计数|附带全部数据集与源码(见文末百度云盘链接)
    项目简介:该项目旨在利用YOLOv8算法实现排球垫球动作的自动识别与计数。YOLOv8作为计算机视觉领域的先进目标检测算法,具备高精度和实时性的特点,非常适合用于体育训练和测试中的自动化计数。项目将排球垫球视频作为输入,通过YOLOv8算法检测视频中的排球及垫球动作,自动记录垫球次......
  • 计数题 随机训练
    CF578D这道题还是挺有意思的。题意简单,就是让你求出与模式串\(S\)长度均为\(len\)的最长公共子序列为\(len-1\)的字符串\(T\)的数量。首先在\(T\)固定的情况下求最长公共子序列,就是经典的dp式子,不再多说。那么对于dp式\(dp_{i,j}\)对\(dp_{n,n}\)最大贡献值......
  • 计数问题的思考方法
    计数问题的思考方法——以《[ARC102E]Stop.Otherwise...》为例DP如果要使用DP,则重点在其状态的设计,即我已经考虑了什么,当前正在考虑什么,通过一个不断将考虑范围扩大的方法,得到答案。在转移的过程中,往往通过当前决策点的不同状态,从不同的状态转移过来(或转移到不同的状态),以得......
  • 数字逻辑电路-74194模5扭环形计数器、74160同步7-23加计数器-Quartus2-时序逻辑电路:
    (建议两个实验分成两个项目做,只有LowFreqClk设计会重复)(有些地方会省略文件置顶和编译,有问题的话看看是不是文件没置顶或没编译)一、实验预习:用双向移位寄存器74194和门电路设计一个右移模5的扭环计数器;并画出电路图二、实验内容:1.双向移位寄存器74194的应用——扭环形......
  • C++实现命令行文本计数统计程序
    附上一位博主写的关于git的使用(个人感觉非常完整,对新手很友好):Git及Tortoisegit下载安装及使用详细配置过程_tortoisegit下载远程代码-CSDN博客 Gitee地址:https://gitee.com/wnmdsqwnhkmc/second-assignment注:本文并不包含主函数,完整代码请移步Gitee路径:[项目>>ConsoleAppl......