本蒟蒻第一次没看题解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. 如何通过JQuery将DIV的滚动条滚动到指定的位置

    这里有一个方法可以将DIV的滚动条滚动到其子元素所在的位置,方便自动定位. var container = $('div'), inner = $('#inner'); container.scrol ...

  2. Codeforces 486E LIS of Sequence --树状数组求LIS

    题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...

  3. 【Unity】Update()和FixedUpdate()

    Update()每帧调用,FixedUpdate()以指定频率被调用. 可以在 Edit -> project settings -> Time -> Fixed Timestep ...

  4. excel技巧

    1. 使文字自动适配方格大小. 自动调整行高(但是合并后的方格不行)

  5. 生产服务器环境最小化安装后 Centos 6.5优化配置[转]

    内容目录 centos6.5最小化安装后配置网络: IP地址, 网关, 主机名, DNS 更新系统源并且升级系统 系统时间更新和设定定时任 创建普通用户并进行sudo授权管理 修改SSH端口号和屏蔽r ...

  6. 如何将matlab画出的图片保存为要求精度

    · 来源:http://emuch.net/bbs/viewthread.php?tid=2705843 杂志社对投稿图片的分辨率通常有如下要求: TIFF: Colour or greyscale ...

  7. 完成卸载vs2010后再安装

    在安装好vs2010后,更改了驱动器号,造成vs工具不能使用,所以需要卸载vs2010 使用Microsoft Visual Studio 2010 Uninstall Utility来卸载vs201 ...

  8. C++ 中dynamic_cast&lt;&gt;的使用方法小结 -判断类型-rtti

    将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理          即会作一定的判断.        对指针进行dynamic ...

  9. U3D杂记

    1,点击UI上的登录按钮,从脚本发出ioo.netmanager.SendConnet->进入CS->soketclient.sendconnet...->netmanager调用 ...

  10. TinyFrame再续篇:整合Spring AOP实现日志拦截

    上一篇中主要讲解了如何使用Spring IOC实现依赖注入的.但是操作的时候,有个很明显的问题没有解决,就是日志记录问题.如果手动添加,上百个上千个操作,每个操作都要写一遍WriteLog方法,工作量 ...