【组合】NOIP2011计算系数

题目描述

给定一个多项式(ax + by)k,请求出多项式展开后xn ym项的系数。
【数据范围】
对于 30%的数据,有0≤k≤10;
对于 50%的数据,有a = 1,b = 1;
对于 100%的数据,有0≤k≤1,000,0≤n, m≤k,且n + m = k,0≤a,b≤1,000,000。

输入格式

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

输出格式

输出共 1 行,包含一个整数,表示所求的系数,这个系数可能很大,输出对10007 取
模后的结果。

题目其实挺简单的,但是要注意数的范围(取模运算的操作应当比较频繁一些),否则就可能会得出一些以外的结果。

#include<iostream>
using namespace std;
int calculate(int base,int number);
int a,b,k,n,m,combi[1001][1001];
int main(){
	cin>>a>>b>>k>>n>>m;
	for(int i=0;i<=k;i++)
	for(int j=0;j<=k;j++)
		combi[i][j]=-1;
	calculate(k,n);
	
	combi[k][n]%=10007;
	for(int i=0;i<n;i++){
		combi[k][n]*=a%10007;
		combi[k][n]%=10007;
	}
	for(int i=0;i<m;i++){
		combi[k][n]*=b%10007;
		combi[k][n]%=10007;
	}
	cout<<combi[k][n]%10007<<endl;
	//system("pause");
	return 0;
}

int calculate(int base,int number){
	if(combi[base][number]!=-1)
		return combi[base][number];
	if(base==number||number==0){
		combi[base][number]=1;
		return combi[base][number];
	}
	combi[base][number]=calculate(base-1,number)+calculate(base-1,number-1);
	combi[base][number]%=10007;
	return combi[base][number];
}


你可能感兴趣的:(ini)