1. 程式人生 > >洛谷【 P1313 計算係數】二項式定理

洛谷【 P1313 計算係數】二項式定理

題目描述

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

輸入輸出格式

輸入格式:

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 

1 1 3 1 2

輸出樣例#1: 

3

說明

【資料範圍】

對於30\%30% 的資料,有0 ≤k ≤100≤k≤10 ;

對於50\%50%的資料,有a = 1,b = 1a=1,b=1;

對於100\%100%的資料,有0≤k ≤1,000,0≤n, m≤k0≤k≤1,000,0≤n,m≤k,且n+m=k ,0 ≤a,b ≤1,000,000n+m=k,0≤a,b≤1,000,000。

noip2011提高組day2第1題

題解:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define ll long long
#define mod 10007
using namespace std;
const int maxn = 1010;
int C[maxn][maxn];
ll quick_pow(ll a, ll b){
    ll ans = 1, res = a;
    while(b){
        if(b & 1) ans = ans * res % mod;
        res = res * res % mod;
        b >>= 1;
    }
    return ans;
}
int main()
{
    int a, b, k, n, m;
    cin >> a >> b >> k >> n >> m;
    memset(C, 0, sizeof C);
    k = n + m;
    for(int i = 0; i <= k; i++)
        C[i][0] = 1;
    for(int i = 1; i <= k; i++)
        C[i][1] = i, C[i][i] = 1;
    for(int i = 1; i <= k; i++)
        for(int j = 1; j <= m; j++)
            if(i > j)
                C[i][j] = (C[i-1][j] + C[i-1][j-1])%mod;
    int ans = 0;
    ans = (C[k][m] * quick_pow(a, n) * quick_pow(b, m))%mod;
    printf("%d\n", ans);
    return 0;
}