P1313 计算系数 [纯数学]

提示:因为markdown和LATEX使用的是懒加载,所以布局没有出来就请耐心等待

[NOIP2011 提高组] 计算系数 题目复制:

题目描述

给定一个多项式 (by+ax)k,请求出多项式展开后 xn×ym 项的系数。

输入格式

输入共一行,包含 5 个整数,分别为 a,b,k,n,m,每两个整数之间用一个空格隔开。

输出格式

输出共一行,包含一个整数,表示所求的系数。

这个系数可能很大,输出对 10007 取模后的结果。

样例 #1

样例输入 #1

1 1 3 1 2

样例输出 #1

3

提示

【数据范围】

对于 30% 的数据,有 0k10

对于 50% 的数据,有 $ a=1b=1$。

对于 100% 的数据,有 0k10000n,mkn+m=k0a,b106

noip2011 提高组 day2 第 1 题。

本题的解题方式主要是依据二项式定理:

(x+y)n=(n0)xny2+(n1)xn1y1+(n2)xn2y2+......+(nn1)x1yn1+(nn)x0yn

其中每个 (nk) 为一个称作二项式系数的特定正整数,其等于 n!k!(nk)! 。这个公式也称二项式公式或二项恒等式。使用求和符号,可以把它写作

(x+y)n=k=0n(nk)xkynk

直接模仿我刚学会的二项式定理,带入,可以得出:

Cknanbmxnym

而组合数可以递推的求:

Cnm=Cn1m+Cn1m1

直接模拟:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
// 快速幂,写模板
long long pow_fast(long long x, long long n) {
if(n==0) {
return 1;
}
long long t = pow_fast(x, n/2)%10007;
if(n&1) {
return t*t%10007*x%10007;
} else {
return t*t%10007;
}
}
// 存储递推后的组合数
long long c[1005][1005] = {};
int main() {
int a, b, k, n, m;
cin >> a >> b >> k >> n >> m;
// 初始化
c[0][0] = c[1][0] = c[1][1] = 1;
// 递推求组合数
for(int i=2; i<=k; i++) {
for(int j=0; j<=i; j++) {
if(j==0) {
c[i][j] = 1;
} else {
c[i][j] = (c[i-1][j]+c[i-1][j-1])%10007;
}
}
}
// 直接输出
cout << c[k][n]*pow_fast(a, n)%10007*pow_fast(b, m)%10007 << endl;
return 0;
}

练习 LATEX 真是有点难度,入门不容易而已

posted @   月神的使者  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示