洛谷 P1313 计算系数 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1313 计算系数 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接: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 计算系数 题解的主要内容,如果未能解决你的问题,请参考以下文章