做出这题,小有成就感

本来已打算要用那个禁位的排列公式,可是,问题在于,每个阶乘前的系数r的求法是一个难点。

随便翻了翻那本美国教材《组合数学》,在容斥原理一章的习题里竟有一道类似,虽然并无答案,但他的注意倒是提醒了我。不妨把那2*n个位置看成排成一个圆周的一列,从中选出k个不相邻的数的组合数。不过,经我验证,他上面的那道公式是错的,应该把n改成2*n才对。哈哈,问题就这样解决了。

在计组合数时,不妨使用全排列的公式,又由于100.。。0007是一个质数,所以可以使用费马小定理在处理各个阶乘除法时求得逆元。

解决。

#include <iostream>
#include <cstdio>
#include <algorithm>
#define MOD 1000000007
#define N 200005
using namespace std; typedef long long LL; LL f[N]; void initial(){
f[0]=1;
for(LL i=1;i<N;i++)
f[i]=(f[i-1]*i)%MOD;
} LL quick(LL p,LL r){
LL ans=1;
while(r){
if(r&1)
ans=(ans*p)%MOD;
r>>=1;
p=(p*p)%MOD;
}
return ans;
} int main(){
initial();
int n;
while(scanf("%d",&n)!=EOF){
if(n<3){
printf("0\n");
continue;
}
LL ans=f[n];
int s=2*n;
for(int i=1;i<=n;i++){
LL uper=((LL)s*f[s-i-1])%MOD;
LL down=(f[s-2*i]*f[i])%MOD;
down=quick(down,MOD-2);
LL res=(((uper*down)%MOD)*f[n-i])%MOD;
if(i&1){
ans=((ans-res)%MOD+MOD)%MOD;
}
else ans=((ans+res)%MOD+MOD)%MOD;
}
printf("%lld\n",ans);
}
return 0;
}

  

最新文章

  1. linux创建新用户以及修改密码
  2. Linux 架构
  3. IOS 网络浅析-(四 get&amp;post)
  4. iOS机器学习-TensorFlow
  5. php5.3升级到5.5
  6. 面试题 ARC
  7. [SCOI2010]股票交易
  8. 11 个简单的 Java 性能调优技巧
  9. Android单元测试之二:本地测试
  10. Xamarin 学习笔记 - Layout(布局)
  11. 浮点型数据转整型的丢失精度问题(C++)
  12. oracle监听器初识-配置多SERVICE_NAMES
  13. Faster-RCNN 自己的数据训练
  14. Yii 框架不同逻辑处理方法统一事务处理
  15. (zhuan) Recurrent Neural Network
  16. whatweb工具
  17. .NET中低版本程序调用高版本DLL
  18. 峰Spring4学习(2)依赖注入的几种方式
  19. C# 数据库增加新表怎么更新ef
  20. vsftp限制FTP用户只能访问自己的目录

热门文章

  1. 2014秋C++ 第7周项目 数据类型和表达式
  2. UVA - 1471 Defense Lines 树状数组/二分
  3. chrome设置书签默认显示
  4. WebBrowser网页操作之提取获取元素和标签(完整篇)
  5. $.ajax 和$.post的区别
  6. Excel—— [导入到数据库] or 将数据 [导入到Excel]
  7. 简述RNN Recurrent Neural Networks
  8. Android跳转到系统Wifi界面的方式
  9. 关于idlf无法输入中文的解决办法
  10. svn中有的代码被标注黄色,绿色和红色,分别表示什么意思呢?