本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题。

考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,,

做完第三题后再回来看这道题,想到暴力算$组合数×错排$,我记得有一天晚上$Snayvals$问过我错排公式怎么推,但我并没有在意!!!幸亏我知道错排可以线性推出来,便开始用笔推错排公式。推了$30min$发现有计算机为什么不用!!!便打了一个表,很快就找出了规律$f[i]=(f[i-1]*f[i-2])*(i-1)$

然后开始解决组合数问题。因为组合数特别大要取模,可是我忘了拓展欧几里得的模板$TwT$,一个月前看了好长时间都没有理解,后来弃疗背过模板一直用着,结果长时间不写就忘了$QAQ$。然后辛苦的回忆$zky学长$讲课时拓展欧几里得是怎么做的,想了一个小时终于通过普通的欧几里得回忆起了拓展欧几里得怎么做,以后再也不会忘了$QuQ$。

可以求逆元,可以线性时间求出错排数和阶乘,然后求出逆元的“前缀积”,$O(5nlogn)$时间内可以求出最大数据内的所有需要的值,离线一下就可以预处理后$O(1)$回答询问啦,就可以A啦~~~最后A掉了这道题,虽然是道水题,但是作为没看题解AC的第一道题心里还是有点激动。

PS:在BZOJ上凑个热闹233

省选时的AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x=getint()
using namespace std;
const int p = 1E9 + 7;
int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - '0';
return k * fh;
}
long long f[1000003], ni[1000003], nic[1000003], jc[1000003];
void mktb(int n) {
f[0] = 1;
f[1] = 0;
f[2] = 1;
for(int i = 3; i <= n; ++i)
f[i] = (((f[i - 1] + f[i - 2])%p) * (i - 1)) % p;
jc[1] = 1;
for(int i = 2; i <= n; ++i)
jc[i] = (jc[i - 1] * i) % p;
}
void exgcd(int a, int b, long long &x, long long &y) {
if (b == 0) {
x = 1; y = 0;
} else {
exgcd(b, a % b, x, y);
long long t = x;
x = y;
y = t - a / b * y;
}
}
void mkny(int n) {
long long x, y;
ni[1] = 1;
for(int i = 2; i <= n; ++i) {
exgcd(i, p, x, y);
ni[i] = x < 0 ? x + p : x;
}
nic[0] = 1;
nic[1] = 1;
for(int i = 2; i <= n; ++i)
nic[i] = (nic[i - 1] * ni[i]) % p;
} struct node {
int n, m;
} q[500003];
int upe = 0; long long Q(int n, int m) {
if (n < m) return 0;
long long ans = (jc[n] * nic[m]) % p;
ans = (ans * nic[n - m]) % p;
ans = (ans * f[n - m]) % p;
return ans;
}
int main() {
freopen("permutation.in", "r", stdin);
freopen("permutation.out", "w", stdout);
int T; read(T);
for(int i = 1; i <= T; ++i) {
read(q[i].n);
read(q[i].m);
if (q[i].n > upe)
upe = q[i].n;
}
mktb(upe);
mkny(upe);
for(int i = 1; i <= T; ++i)
printf("%I64d\n", Q(q[i].n, q[i].m));
fclose(stdin);
fclose(stdout);
return 0;
}

啦啦啦

【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数的更多相关文章

  1. SDOI 2016 Round1 Day2

    生成魔咒 /* 后缀数组+双向链表 参照:https://blog.csdn.net/clove_unique/article/details/53911757 */ #include<cstd ...

  2. 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途

    比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...

  3. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  4. 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记

    我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...

  5. [BZOJ 4516] [SDOI 2016] 生成魔咒

    Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例 ...

  6. SDOI 2016 Round1 Day1

    储能表 /* 引自zyz大佬的数学思想 */ #include<cstdio> #include<iostream> using namespace std; typedef ...

  7. BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 911  Solved: 566[Submit][Status ...

  8. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  9. BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]

    4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...

随机推荐

  1. NOIP2007矩阵取数[DP|高精度]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  2. 第9章 用内核对象进行线程同步(1)_事件对象(Event)

    9.1 等待函数 (1)WaitForSingleObject(hObject,dwMilliseonds); ①dwMilliseconds为INFINITE时表示无限等待 ②dwMilliseco ...

  3. 加载cocos studio场景

    今天尝试加载cocos studio的场景. 新版的cocos studio中,"导出"选项变成了"发布".发布之后会生成一个res文件夹,其中每个场景有一个. ...

  4. AFNetworking 基本使用

    AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的 3如何选择AFNetwork ...

  5. 独立成分分析(ICA)在fMRI数据处理时timecourse的理解

    来源: http://blog.sciencenet.cn/blog-479412-434990.html   在处理fMRI数据时,使用空间ICA的方法.将一个四维的fMRI数据分解为空间patte ...

  6. windows和ubuntu下gif动态图片的制作

    现在社交软件中, 各种各样的动图为大家交流很大的乐趣.  Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等. 这里简单介绍一下在window系统和ubuntu系统下gif ...

  7. 史上最全的CSS hack方式一览

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  8. myeclipse 8.5离线安装python插件

    看到网上很多教程扯了一大堆,好麻烦的样子. 1)下载pyhon开发插件,PyDev 2.2.0.zip 我在百度137708820网盘里已分享,链接http://pan.baidu.com/s/1mg ...

  9. NOI2018准备Day5

    3个半小时,连看题解带超过了一道二分题.

  10. 数据字典生成工具之旅(8):SQL查询表的约束默认值等信息

    上一篇代码生成工具里面已经用到了读取表结构的SQL,这篇将更加详细的介绍SQL SERVER常用的几张系统表和视图! 阅读目录 系统表视图介绍 实际应用 本章总结 工具源代码下载 学习使用 回到顶部 ...