您的位置:首页 > 编程语言 > C语言/C++

NOIP2011计算系数详解

2017-10-09 17:42 302 查看
原题见洛谷(https://www.luogu.org/problem/show?pid=1313

想看稍微简单点的就是NOIP2016的组合数问题,小飞机~(http://blog.csdn.net/a1351937368/article/details/76907902

先说一下这道题需要用到:组合数(杨辉三角),乘方

做这道题的感受:题目中说(by+ax)^k,而输入顺序是先a后b搞得我60分emmmm,膜10007记得要开long long有可能会爆int

根据二项式定理,(x+y)^k中x^m*y^(k-m)的系数为C(k,m)

让我们改装一下:(ax+by)^k中x^m*y^(k-m)的系数为C(k,m)*a^m*b^(k-m)

然后这道题就可以乖乖的AC啦~再加点玄学卡常数和优化这道题总时间0ms(其实没必要)

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>

const int maxn=1500;
int c[maxn][maxn];

inline int read(){
int num;
char ch;
while((ch=getchar())<'0' || ch>'9');
num=ch-'0';
while((ch=getchar())>='0' && ch<='9'){
num=num*10+ch-'0';
}
return num;
}
inline void out(int x){
if(x>=10){
out(x/10);
}
putchar(x%10+'0');
}
inline int time(int p,int q){
if(q==0){
return 1;
}
long long ans=1;
for(register int i=1;i<=q;++i){
ans*=p,ans%=10007;
}
return ans;
}

int main(){
int b=read(),a=read(),k=read(),n=read(),m=read();
long long ans;
c[0][0]=1;
for(register int i=1;i<=k;++i){
c[i][0]=c[i][i]=1;
}
for(register int i=1;i<=k;++i){
for(register int j=1;j<i;++j){
c[i][j]=(c[i-1][j]+c[i-1][j-1])%10007;
}
}
ans=c[k][m]*(time(a,m)*time(b,n)%10007)%10007;
out(ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ NOIP