首页 > 其他分享 > P4071 [SDOI2016]排列计数

P4071 [SDOI2016]排列计数

时间:2023-06-13 21:23:35浏览次数:37  
标签:10 测试点 leq long 计数 SDOI2016 P4071 sim mod

[SDOI2016]排列计数

题目描述

求有多少种 \(1\) 到 \(n\) 的排列 \(a\),满足序列恰好有 \(m\) 个位置 \(i\),使得 \(a_i = i\)。

答案对 \(10^9 + 7\) 取模。

输入格式

本题单测试点内有多组数据

输入的第一行是一个整数 \(T\),代表测试数据的整数。

以下 \(T\) 行,每行描述一组测试数据。

对于每组测试数据,每行输入两个整数,依次代表 \(n\) 和 \(m\)。

输出格式

共输出 \(T\) 行,对于每组测试数据,输出一行一个整数代表答案。

样例 #1

样例输入 #1

5
1 0
1 1
5 2
100 50
10000 5000

样例输出 #1

0
1
20
578028887
60695423

提示

数据规模与约定

本题共 20 个测试点,各测试点等分,其数据规模如下表。

测试点编号 \(T =\) \(n, m \leq\) 测试点编号 \(T =\) \(n, m \leq\)
\(1\sim 3\) \(10^3\) \(8\) \(10 \sim 12\) \(10^3\) \(10^3\)
\(4 \sim 6\) \(10^3\) \(12\) \(13 \sim 14\) \(5 \times 10^5\) \(10^3\)
\(7 \sim 9\) \(10^3\) \(100\) \(15 \sim 20\) \(5 \times 10^5\) \(10^6\)
对于全部的测试点,保证 \(1 \leq T \leq 5 \times 10^5\),\(1 \leq n \leq 10^6\),\(0 \leq m \leq 10^6\)。

问题是要求有 \(m\) 个稳定的位置,我们可以转换成求 \(n-m\) 个不稳定的位置

则从 \(n\) 个数中找 \(n-m\) 个位置的式子是 \(C^{n - m}_n\)

而根据错排式子:若有 \(n\) 个位置,则 \(f(n) = (n - 1) * (f(n - 1) + f(n - 2))\)

则可以得到最终式子 \(c^{n-m}_n * f(n - m)\)

其中 \(c^{n-m}_n\) 和 \(f(n - m)\) 可以预处理得到

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>

using namespace std;

const long long mod = 1e9 + 7; 
long long dp[5211314], n, m, t;
long long inv[5211314], f[5211314];

int main() {
	dp[0] = 1; 
	//注意dp[0]为1 
	dp[1] = 0;
	dp[2] = 1;
	f[0] = f[1] = inv[0] = inv[1] = 1;
	for (int i = 1; i <= 1000000; ++ i) {
		if (i != 1 && i != 2) dp[i] *= (i - 1);
		dp[i] %= mod; 
		dp[i + 1] += dp[i];
		dp[i + 1] %= mod;
		dp[i + 2] += dp[i];
		dp[i + 2] %= mod;
		if (i >= 2) {
			f[i] = f[i - 1] * i % mod;
			inv[i] = (mod - mod / i) * inv[mod % i] % mod;
		}
	}
	for (int i = 2; i <= 1000000; ++ i) {
		inv[i] = inv[i - 1] * inv[i] % mod;
	} 
	scanf("%lld", &t);
	while (t --) {
		scanf("%lld%lld", &n, &m);
		printf("%lld\n", (((f[n] * inv[n - m] % mod) * inv[m] % mod) * dp[n - m] % mod));
	}
	return 0; 
} 

标签:10,测试点,leq,long,计数,SDOI2016,P4071,sim,mod
From: https://www.cnblogs.com/jueqingfeng/p/17478730.html

相关文章

  • c语言:计数器实验
    要求:P1口接2只LED灯,定时器T1采用计数模式,方式1中断,外接按钮开关作为计数输入,当按2次按钮开关,P1口第一只LED点亮,再按2次按钮开关,P1口第二只LED点亮,再按2次按钮,所有LED灯熄灭。 1#include<reg52.h>23//定义LED灯的控制端口和对应的控制位4sbitLED1=P1^0;5......
  • CCSP2019T2_纸牌计数 | 2019苏州CCSP大学生计算机系统与程序设计竞赛
    题目描述偶然在CSDN看到有人写了CCSP2019T2_纸牌计数的题解,突然想起来是一个不错的计数、dp题。以前的U盘找不到了,记得当时存了一步步偏分到AC代码,可惜。又想起来18年打铁了。。。此人的题解的链接CCSP201902纸牌计数——解题报告当年一共有5题,取自:https://www.sohu.com/a/34......
  • 解决layui框架自带的excel导出长数据变科学计数法
    项目中需要导出excel时,如果是大项目、要求高,当然使用第三方插件,或者后台导出是必要的,但是如果是一些小型项目,并且对导出excel样式要求不是很严格的,而且前端框架用的是layui的,layui框架自带的excel导出就成了我们最方便快捷的选择,但是在导出数据时会遇到一个问题:问题:layui框架自......
  • Jmeter 循环控制器与计数器
    图1 图2  图3 图4: 图5:  图6:   ......
  • Java:从单线程计数器到多线程数据同步synchronized和原子类Atomic
    (目录)使用单线程单线程修改计数器的值,没有发生问题,每次运行结果都是10000,不过程序耗时较长packagecom.example;/***计数器*/classCounter{privatestaticlongcount;publicstaticlonggetCount(){returncount;}publicstaticv......
  • 实验 透视表 计数 len np.count_nonzero 正确与否
    实验透视表计数 len np.count_nonzero正确与否结果:len正确 np.count_nonzero错误结论:除去三行干扰行(原值均为缺失值)以外:未过账中,有1行无业务员名称无业务员名称中,有1行未过账即:未过账且无业务员名称有1行未过账且有业务员名称有57行已过账且无业务员名称有57行最......
  • 格路计数学习笔记
    格路计数学习(抄写)笔记\(2\)\(\operatorname{Dyck}\)路\(2.1\) 格路​ 定义2.1在平面直角坐标系中,横坐标和纵坐标都是整数的点称为格点,平面格路是指从一个格点到另一格点只走格点的路,格路的长度是指其所走的路的步数。\(2.2\) 自由路​ 定义\(2.2\)对于一条从\((0......
  • 89C51实现单个指定按键消抖后计数(使用共阴极数码管7SEG-MPX8-CC-BLUE)
     位选关键锁存器按键(消抖)区小灯泡D1用于指示SW1是否被检测到按下(计数器设置为1次就溢出,在中断中计数num+1的同时对小灯泡连接的端口取反用于指示)。#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintun......
  • Linux 内核时钟架构之时钟源读取计数
    前面我们讲到,时钟源是给timekeeping使用的,timekeeping会定时更新,这就依赖timekeeping模块需要读取clocksource的计数,计算时间流逝。然后对时间进行叠加,得到当前时间。 ktime_get()--->tk_core.timekeeperclocksource.read()timekeeping_get_ns()--》read()......
  • HDU4633(Polya计数)
    题目:Who'sAuntZhang#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;typedeflonglongLL;constLLMOD=10007;LLquick_mod(LLa,LLb){LLans=1;a%=MOD;while(b){if(b&1......