OTZ%%%子谦。大佬

又上了节课。。。俩题

计算系数    组合数问题。。。

要不是大佬指点就只能阶乘暴力算了

(主要还是我忘了杨辉三角)

杨辉三角与组合数C有着千丝万缕的联系,在计算,使用方面相当方便。

先说计算系数

计算系数

给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m项的系数。

输出结果%10007

#include<bits/stdc++.h>
using namespace std;
long long k,a,b;
long long n,m;
long long t=1;
long long c[1005][1005];
int main(){
cin>>a>>b>>k>>m>>n;
c[0][0]=1;
a=a%10007;
b=b%10007;
k=k%10007;
n=n%10007;
m=m%10007;//输入需要先取模,不然会很大
for(int i=1;i<=k;i++){
for(int j=1;j<=i;j++){
c[i][0]=1;
c[i][j]=c[i-1][j]+c[i-1][j-1];//处理原理,杨辉三角
c[i][j]%=10007;//预处理,待会直接调用
}
}
for(int i=1;i<=m;i++){
t*=a;
t%=10007;
}
for(int i=1;i<=n;i++){
t*=b;
t%=10007;
}//忘记*a*b很致命...
cout<<(t%10007*c[k][n]%10007)%10007;
  return 0;
}

组合数问题

给定 n,m 和 k,对于所有的  0in,0jmin(i,m) 有多少对 (i,j) 满足C 是 k的倍数。

#include<bits/stdc++.h>
using namespace std;
int k;
int n,m;
int t;
int c[2005][2005];
int ans[2005][2005];
int main(){
    scanf("%d%d",&t,&k);
    for(int i=0;i<=2000;i++) c[i][0]=1;
    for(int i=1;i<=2000;i++){
        for(int j=1;j<=i;j++){
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;//这里取模免去以后的判断
        }
    }
    for(int i=1;i<=2000;i++){
        for(int j=1;j<=i;j++){
            ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];//前缀和,减去重复的
            if(!c[i][j]) ans[i][j]++;
        }
        ans[i][i+1]=ans[i][i];
    }
    for(int a=1;a<=t;a++){
        scanf("%d%d",&n,&m);
        if(n<m) m=n;
        printf("%d\n",ans[n][m]);
    }
    return 0;
}

同样杨辉三角

最后%下子谦。

猜你喜欢

转载自www.cnblogs.com/648-233/p/10656561.html
今日推荐