本蒟蒻第一次没看题解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. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  2. 转:大气炫酷焦点轮播图js特效

    使用方法 Step 1. 在html的标签内引入相关文件 <script type="text/javascript" src="js/myfocus-2.0.0. ...

  3. memcache的安装和使用

    Memcache Memcached是一个高性能的分布式缓存系统.memcached自身不会实现分布式,分布式是由程序来实现的. Memcached一旦安装之后,自身进行管理!预申请一个很大的内存空间 ...

  4. c#匿名类,匿名对象

    何谓匿名类,其实本质和普通定义的类一样,只不过是由系统的编译器来完成的,首先举个例子. 一般情况 //声明一个类,包含贴别多的字段 public class Person() { public str ...

  5. HTML 学习笔记 CSS样式(框模型)

    CSS框模型( Box Model)规定了元素框处理元素的内容 内边距 边框 和 外边距的方式 CSS框模型概述 可以用下面的模型图概述

  6. insertBefore的兼容性问题

    父级.insertBefore(新的元素,被插入的元素)方法 在指定的元素前面插入一个新元素 在ie下如果第二个参数的节点不存在,会报错 在其他浏览器下如果第二个参数不存在,则会以appendChil ...

  7. js删除数据的几种方法

    js 删除数组几种方法 var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为u ...

  8. java工程中的.classpathaaaaaaaaaaaaaaaa<转载>

    第一部分:classpath是系统的环境变量,就是说JVM加载类的时候要按这个路径下去找,当然这个路径下可以有jar包,那么就是jar包里所有的class. eclipse build path是ec ...

  9. 笔记 (note)

    笔记[问题描述]给定一个长度为m的序列a,下标编号为1~m.序列的每个元素都是1~n的整数.定义序列的代价为m−1 ∑|ai+1-ai| i=1 你现在可以选择两个数x和y,并将序列a中所有的x改成y ...

  10. 通用权限管理系统组件3.9 的 Oracle 数据库创建脚本参考

    ---------------------------------------------------- -- Export file for user USERCENTER -- -- Create ...