博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1313 计算系数
阅读量:5769 次
发布时间:2019-06-18

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

数学很重要!!

dalao们扫这道题就说“二项式定理”。二项式定理是这个东西:

\[(x+y)^n=\sum_{i=0}^{n}{C_n^i \ x^i \ y^{n-i}}\]

应该没打错。真的没打错。

二项式定理当然不仅只满足于这些变量系数只为1的,只要系数扔进变量里面一起去乘方就可以了。

那么如何解决这道题?

其实答案就是这个东西(大胆猜想,打表证明):

\[C_k^n \times a^n \times b^m\]

上面的组合数可以换成\(C_k^m\),意义相同。因为\(n+m=k\)

如何算得组合数?简单点的话你可以通过杨辉三角来\(O(k^2)\)的来边递推边取膜得到。

或者你可以像我这样,通过预处理阶乘,通过组合数的定义式\(C_m^n=\frac{m!}{n!(m-n)!}\)来得到。

注意:膜意义下没有除法,所以你要算乘法逆元。用费马小定理就能算出来了。

然后中间过程可能爆int,直接开long long,不用龟速乘,用快速幂就能够搞出来了。

讲道理我一点题解都没看。

代码:

#include
const int maxn = 1005;const int mod = 10007;#define ll long longll a, b, k, n, m;ll frac[maxn];ll pow_mod(ll x, ll y, ll z){ ll ans = 1, base = x; while(y) { if(y & 1) ans = ans * base % z; base = base * base % z; y >>= 1; } return ans % z;}ll inv(ll x, ll p){ return pow_mod(x, p - 2, p);}int main(){ scanf("%lld%lld%lld%lld%lld", &a, &b, &k, &n, &m); frac[0] = 1; for(int i = 1; i <= k; i++) frac[i] = frac[i - 1] * i % mod; ll zuheshu = frac[k] * inv(frac[n], mod) % mod * inv(frac[k - n], mod) % mod; ll a_n = pow_mod(a, n, mod); ll b_m = pow_mod(b, m, mod); ll ans = zuheshu * a_n % mod * b_m % mod; printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/Garen-Wang/p/9769401.html

你可能感兴趣的文章
机房带宽暴涨问题分析及解决方法
查看>>
XP 安装ORACLE
查看>>
八、 vSphere 6.7 U1(八):分布式交换机配置(vMotion迁移网段)
查看>>
[转载] 中华典故故事(孙刚)——19 万岁
查看>>
php5编译安装常见错误和解决办法集锦
查看>>
Unable to determine local host from URL REPOSITORY_URL=http://
查看>>
ORACLE配置,修改tnsnames.ora文件实例
查看>>
Workstation服务无法启动导致无法访问文件服务器
查看>>
Linux常用命令(一)
查看>>
一个自动布署.net网站的bat批处理实例
查看>>
我的友情链接
查看>>
Centos6.6安装选包及基础场景说明
查看>>
java基础面试题-1
查看>>
lamp+nginx代理+discuz+wordpress+phpmyadmin搭建一
查看>>
windows server 2016 活动目录(二)
查看>>
openstack G版 修改vm的flavor级别
查看>>
python_控制台输出带颜色的文字方法
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>