传送门

其实标签只是搞笑的。

没那么难。

二项式反演只是杀鸡用牛刀而已。

这道题也只是让你n≤20n\le20n≤20的错排数而已。

还记得那个O(n)O(n)O(n)的递推式吗?

没错那个方法比我今天用的要快一些。


言归正传。

回忆一下二项式反演的式子:

fn=∑i=0n(ni)gif_n=\sum_{i=0}^n\binom{n}{i}g_ifn​=∑i=0n​(in​)gi​

=>gn=∑i=0n((−1)i(nn−i)fi)g_n=\sum_{i=0}^n((-1)^i\binom{n}{n-i}f_i)gn​=∑i=0n​((−1)i(n−in​)fi​)

证明很简单。

只用把第一个式子成立的条件带到第二个等式的右边就可以了。

然后这道题怎么用呢?

我们令fif_ifi​表示iii张牌任意排列的总方案数。

gig_igi​表示iii张牌全部错排的方案数。

那么根据分类计数的原理显然有:

fn=∑i=0ngi=n!f_n=\sum_{i=0}^ng_i=n!fn​=∑i=0n​gi​=n!

于是gn=∑i=0n((−1)i(ni)fi)=∑i=0n((−1)in!(n−i)!)g_n=\sum_{i=0}^n((-1)^i\binom{n}{i}f_i)=\sum_{i=0}^n((-1)^i\frac{n!}{(n-i)!})gn​=∑i=0n​((−1)i(in​)fi​)=∑i=0n​((−1)i(n−i)!n!​)

做完了。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=21;
ll fac[N];
int n;
int main(){
	fac[0]=1;
	for(int i=1;i<=20;++i)fac[i]=fac[i-1]*i;
	while(~scanf("%d",&n)){
		ll ans=0,tmp=1;
		for(int i=0;i<=n;++i,tmp*=-1)ans+=tmp*fac[n]/fac[i];
		cout<<ans<<'\n';
	}
	return 0;
}

2018.11.07 hdu1465不容易系列之一(二项式反演)的更多相关文章

  1. 2018.11.07 NOIP模拟 数独(模拟)

    传送门 sbsbsb签到题. 读题时间比写题时间长系列. 写一个checkcheckcheck函数来检验当前时间段第(i,j)(i,j)(i,j)号格子能否放入kkk就行了. 代码

  2. Unity进阶----AssetBundle_03(2018/11/07)

    1. 为啥有AB包? 因为资源需要更新, 避免更新一次打包一次 动态修改. 2. AB包注意啥? 依赖关系 找依赖关系应该找到对应的平台!!! 3. 打包策略是分场景打包 若文件被文件夹包含打包出来的 ...

  3. 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)

    传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码

  4. 2018.11.07 bzoj1965: [Ahoi2005]SHUFFLE 洗牌(快速幂+exgcd)

    传送门 发现自己的程序跑得好慢啊233. 管他的反正AC了 先手玩样例找了一波规律发现题目要求的就是a∗2m≡l(modn+1)a*2^m\equiv l \pmod {n+1}a∗2m≡l(modn ...

  5. 2018.11.07 bzoj2751: [HAOI2012]容易题(easy)(组合数学)

    传送门 组合数学一眼题. 感觉一直做这种题智商会降低. 利用组合数学的分步计数原理. 只用关心每个数不被限制的取值的总和然后乘起来就可以了. 对于大部分数都不会被限制,总和都是n(n+1)2\frac ...

  6. 2018.11.07 NOIP训练 lzy的游戏(01背包)

    传送门 考虑对于每次最后全部选完之后剩下的牌的集合都对应着一种构造方法. 一个更接地气的说法: 设消耗的牌数为ttt,如果使用的牌的lll值之和也为ttt,则对应着一种构造方式让这种情形成立. 于是做 ...

  7. 2018.11.07 NOIP模拟 异或(数位dp)

    传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码

  8. 2018.11.07 NOIP模拟 分糖果(贪心)

    传送门 考虑 n = 2 时的情况:假定两个人分别为(a, b),(c, d),则当且仅当min(a,d) ≤ min(b,c)时,把(a, b)放在前面更优,否则把(c, d)放在前面更优 然后把n ...

  9. 2018.11.07 codeforces559C. Gerald and Giant Chess(dp+组合数学)

    传送门 令f[i]f[i]f[i]表示对于第iii个棋子,从(1,1)(1,1)(1,1)出发到它不经过其它棋子的方案数. 于是我们假设(h,w)(h,w)(h,w)有一个棋子,求出它的fff值就可以 ...

随机推荐

  1. Mac快捷键大全

    Android Studio command+option+L:格式化代码 Visual Studio Code option+shift+f:格式化代码 先按command+k,再按command+ ...

  2. python指针

    class ListNode: def __init__(self, x): self.val = x self.next = None就两个属性 value 和 next,因为单节点默认next是没 ...

  3. 自动化测试之selenium工具简单介绍

    一.selenium简单介绍 1.selenium的成员 2.selenium工作原理 二.webdrive 常见元素定位

  4. @RequestMapping 和 @GetMapping @PostMapping 区别

      @RequestMapping   和  @GetMapping @PostMapping 区别 @GetMapping是一个组合注解,是@RequestMapping(method = Requ ...

  5. linux命令学习之:passwd

    passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 passwd(选项)(参数) ...

  6. http协议的学习

    TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.

  7. jq里面关于disable的用法

    //两种方法设置disabled属性$('#areaSelect').attr("disabled",true);$('#areaSelect').attr("disab ...

  8. DialogActivity

    <?xml version="1.0" encoding="utf-8"?> <resources> <style name=&q ...

  9. vue总结2

    1. 给router-link添加事件 之前用v-link 现在用 router-link 添加事件要用原生的.native修饰v-on <my-component v-on:click.nat ...

  10. Oauth2.0 认证的Web api例子

    Oauth2.0的解释 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容.OA ...