NOIP2016 day2T1 组合数问题

来源:互联网 发布:macbook air破解软件 编辑:程序博客网 时间:2024/06/06 07:01

在考场的时候,并不知道组合数和杨辉三角形一一对应

出考场,知道一一对应之后,一遍就A了,,,

-组合数和杨辉三角形一一对应

-可以暴力出2000以内所有组合数,然后加上前缀和,这样就可以过了

-如果想要更快,可以边读入边暴力,就像我这样,但是写起来会比较麻烦

-看大佬写的代码,原来可以先读入所有的m,n取其中的最大值,然后直接暴力到最大值那里,这样写起来很方便

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int read(){    int f=1,p=0;    char c=getchar();    while(c>'9'||c<'0')    {        if(c=='-')f=-1;        c=getchar();    }    while(c>='0'&&c<='9')    {        p=p*10+c-'0';        c=getchar();    }    return f*p;}int t,k=4,m,n,nn=1;int c[2010][2010];int f[2010][2010];void work(int n){    for(int i=nn+1;i<=n;i++)        for(int j=0;j<=i;j++)        {            if(!j||j==i){c[i][j]=1;continue;}            c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;        }    for(int i=nn+1;i<=n;i++)        for(int j=0;j<=2000;j++)        {            if(!c[i][j])f[i][j]=1;            f[i][j]+=(f[i-1][j]+f[i][j-1]-f[i-1][j-1]);        }}int main(){    t=read(),k=read();    memset(c,0x7f,sizeof(c));    c[1][0]=1,c[1][1]=1;    while(t)    {        n=read(),m=read();        if(n>nn){work(n);nn=n;}        printf("%d\n",f[n][m]);        t--;    }    return 0;}


0 0
原创粉丝点击