博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZOJ 3688
阅读量:5360 次
发布时间:2019-06-15

本文共 983 字,大约阅读时间需要 3 分钟。

做出这题,小有成就感

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

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

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

解决。

#include 
#include
#include
#define MOD 1000000007#define N 200005using namespace std;typedef long long LL;LL f[N];void initial(){ f[0]=1; for(LL i=1;i
>=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;}

  

转载于:https://www.cnblogs.com/jie-dcai/p/4003276.html

你可能感兴趣的文章
Lua 语言基本语法
查看>>
ARM 的Thumb状态测试
查看>>
windows下读取utf-8文件
查看>>
apache 启动不了的排查方法
查看>>
Java有没有goto?
查看>>
(转)makefile 的用法
查看>>
求不相邻金币相加和的最大值--动态规划1
查看>>
[转][osg]探索未知种族之osg类生物【目录】
查看>>
四十九. Zabbix报警机制 、 Zabbix进阶操作 、 监控案例
查看>>
元类中__new__ 与 __init__的区别--day27
查看>>
占小狼的简书博客
查看>>
struts2__action执行顺序
查看>>
php异常处理
查看>>
[xampp] /usr/bin/env: php: No such file or directory
查看>>
细学PHP 10 贴吧-2
查看>>
黑客攻防入门秘籍
查看>>
Swift迎来了1.0 GM 版(2014.09.09)
查看>>
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>