1. 程式人生 > >P1313 計算系數

P1313 計算系數

tro stream noip2011 展開 描述 輸入輸出 二項式定理 計算 ios

題目描述

給定一個多項式(by+ax)^k,請求出多項式展開後x^n*y^m 項的系數。

輸入輸出格式

輸入格式:

輸入文件名為factor.in。

共一行,包含5 個整數,分別為 a ,b ,k ,n ,m,每兩個整數之間用一個空格隔開。

輸出格式:

輸出共1 行,包含一個整數,表示所求的系數,這個系數可能很大,輸出對10007 取模後的結果。

輸入輸出樣例

輸入樣例#1:
1 1 3 1 2
輸出樣例#1:
3

說明

【數據範圍】

對於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。

noip2011提高組day2第1題

題解:

楊輝三角求二項式系數

二項式定理 (a+b)^n=sigema(r=0--n)C(n r)*a^(n-r)*b^r

求x^n*y^m就是求 (a+b)^k的第(m+1)的系數,但是題目是(ax+by)^k,求x^n*y^m,就在原來楊輝三角求出的系數的基礎上乘上a^n*b^m

自己寫幾個公式推推就能發現。

代碼

#include<iostream>
#include<cstdio>
#define mod 10007
using namespace std;
int a,b,k,n,m,c[1010][1010];
long long
mul(int x,int y){ long long now=x,ans=1; while(y){ if(y&1)ans=ans*now%mod; now=now*now%mod; y>>=1; } return ans; } int main(){ scanf("%d%d%d%d%d",&a,&b,&k,&n,&m); c[0][0]=1; for(int i=1;i<=k;i++){ for(int j=0;j<=i;j++){
if(j==0)c[i][j]=1; else if(j==i)c[i][j]=1;else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; } } cout<<c[k][m]*mul(a,n)%mod*mul(b,m)%mod; return 0; }

P1313 計算系數