Description

求有多少种长度为 n 的序列 A,满足以下条件:
1 ~ n 这 n 个数在序列中各出现了一次
若第 i 个数 A[i] 的值为 i,则称 i 是稳定的。序列恰好有 m 个数是稳定的
满足条件的序列可能很多,序列数对 10^9+7 取模。

Input

第一行一个数 T,表示有 T 组数据。
接下来 T 行,每行两个整数 n、m。
T=500000,n≤1000000,m≤1000000

Output

输出 T 行,每行一个数,表示求出的序列数

Sample Input

5
1 0
1 1
5 2
100 50
10000 5000

Sample Output

0
1
20
578028887
60695423

Solution

模数写错+忘了判掉$n=m$所以$WA$了两发……

别问我没判是怎么过的样例……头铁没有测……

这个题答案显然是$C(n,m)*d[n-m]$,其中$d[i]$为$i$的错排公式。

Code

 #include<iostream>
#include<cstdio>
#define N (2000009)
#define LL long long
#define MOD (1000000007)
using namespace std; LL T,n,m,inv[N],fac[N],facinv[N],d[N]; void Init()
{
inv[]=fac[]=facinv[]=;
for (int i=; i<=; ++i)
{
if (i!=) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
fac[i]=fac[i-]*i%MOD; facinv[i]=facinv[i-]*inv[i]%MOD;
}
d[]=; d[]=; d[]=;
for (int i=; i<=; ++i) d[i]=(d[i-]+d[i-])*(i-)%MOD;
} LL C(LL n,LL m)
{
if (n<m) return ;
return fac[n]*facinv[m]%MOD*facinv[n-m]%MOD;
} int main()
{
Init();
scanf("%lld",&T);
while (T--)
{
scanf("%lld%lld",&n,&m);
printf("%lld\n",C(n,m)*d[n-m]%MOD);
}
}

最新文章

  1. Swift与OC混编
  2. zjuoj 3607 Lazier Salesgirl
  3. Manacher
  4. BZOJ 1011 [HNOI2008]遥远的行星
  5. android 5.0 -- Activity 过渡动画
  6. Compilation err ororg.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
  7. js取数组最大值的四种方式
  8. std::rotate使用
  9. LuoGu P1939 【模板】矩阵加速(数列)
  10. Spring中Mybatis的花样配置 及 原理
  11. PowerShell使用ServicePrincipal登陆Azure
  12. React Native常用组件之ScrollView
  13. 20171018 微信小程序客户端数据和服务器交互
  14. webpack打包使用
  15. docker容器重启故障
  16. 左手坐标系和右手坐标系 ZZ
  17. 更新Newtonsoft.Json后报异常,未能加载文件或程序集“Newtonsoft.Json
  18. 基于request.getAttribute与request.getParameter的区别详解
  19. How To Install Cacti On Ubuntu 14
  20. java 生成和解析xml

热门文章

  1. [javaEE] http协议详细
  2. SpringMVC中异常捕获
  3. 面向对象(static关键字的特点)
  4. BZOJ1911: [Apio2010]特别行动队(dp 斜率优化)
  5. 【转发】【小程序】微信小程序日常开发中常遇到的错误代码
  6. Android 如何监听一个线程的开始和结束
  7. LeakCanary上传 leak trace 到服务器
  8. Android微信支付—注意事项
  9. Windows远程桌面Debian配置
  10. shell_basic