洛谷P2822 组合数问题(NOIp2016)

来源:互联网 发布:龙卷风流量软件下载 编辑:程序博客网 时间:2024/06/05 16:42

找规律 组合数学

题目传送门

对于像我这种不会组合数学的蒟蒻来说,这种题目只能找规律了。。。
直接暴力打表,然后发现:
这不是杨辉三角么???
华丽丽地写出递推式,k什么的模一模就行啦!
代码:

#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 2000using namespace std;int f[MAXN+5][MAXN+5],a[MAXN+5][MAXN+5];int t,n,m,k;int main(){    scanf("%d%d",&t,&k);    a[0][0]=1;//从0开始推    for (int i=1;i<=MAXN;i++)        for (int j=1;j<=MAXN;j++)            if (j<=i){                a[i][j]=(a[i-1][j-1]+a[i-1][j])%k;//杨辉三角递推式                f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1];//满足条件方案数                if (!a[i][j]) f[i][j]++;            }            else f[i][j]=f[i][i];    while (t--){        scanf("%d%d",&n,&m);        n++; m++;//因为前面从0开始推,所以这里要加        printf("%d\n",f[n][min(m,n)]);    }    return 0;}