1. 程式人生 > >洛谷 P1313 計算系數 題解

洛谷 P1313 計算系數 題解

|| 空格 處理 一個空格 mat c代碼 for 輸入輸出 size

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接:https://www.luogu.org/problem/show?pid=1313

題目描述

給定一個多項式(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題

分析:

xjb推公式,然後就A了

多寫幾組(ax+by)^r的展開式,就能發現對於x^n*y^m這一項,r=m+n。

而且a、b的系數與x、y的系數是對應相等的。這樣就解決了a、b的問題。

最後發現,在楊輝三角裏,每一行的y的次數是從0開始遞增的,所以我們預處理出楊輝三角第r行的數字,剩余的那個系數就是num[r][y+1]。

註意要不停地取膜!讀入的時候以防萬一也要取!

AC代碼:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 using namespace std;
 7 const int MOD = 10007;
 8 
 9 inline void read(int &x)
10 {
11     char ch = getchar(),c = ch;x = 0;
12     while(ch < 
0 || ch > 9) c = ch,ch = getchar(); 13 while(ch >= 0 && ch <= 9) x = (x<<1)+(x<<3)+ch-0,ch = getchar(); 14 if(c == -) x = -x; 15 } 16 17 int a,b,k,n,m,cnt,sum; 18 long long num[1005][1005]; 19 long long ans; 20 21 inline int min(int a,int b) 22 { 23 return a<b?a:b; 24 } 25 26 long long ksm(int base,int n) 27 { 28 long long ans = 1; 29 for(;n;n>>=1) 30 { 31 if(n&1) 32 ans = ans*base%MOD; 33 base = base*base%MOD; 34 } 35 return ans; 36 } 37 38 int main() 39 { 40 read(a),read(b),read(k),read(n),read(m); 41 a = a%MOD,b = b%MOD,n = n%MOD,m = m%MOD; 42 ans = (ksm(a,n)%MOD * ksm(b,m)%MOD)%MOD; 43 sum = m+n; 44 num[1][1] = 1,num[2][1] = 1,num[2][2] = 2,num[2][3] = 1; 45 for(int i = 2;i <= sum;++ i) 46 { 47 num[i+1][1] = 1; 48 for(int j = 2;j <= i+2;++ j) 49 if(num[i][j-1]) 50 num[i+1][j] = (num[i][j-1]+num[i][j])%MOD; 51 } 52 ans = ans*num[sum][m+1]%MOD; 53 printf("%lld\n",ans); 54 return 0; 55 }

洛谷 P1313 計算系數 題解