LuoguP2822 组合数问题(组合数,二维前缀和)

P2822 组合数问题

 

 

输入输出样例

输入样例#1: 复制
1 2
3 3
输出样例#1: 复制
1
输入样例#2: 复制
2 5
4 5
6 7
输出样例#2: 复制
0
7

说明

【样例1说明】

在所有可能的情况中,只有C_2^1 = 2C21=2是2的倍数。

【子任务】

 

#include<bits/stdc++.h>

#define N 2001
#define ll long long

using namespace std;
ll n,m,t,k,ans,cnt;
ll C[N+5][N+5],sum[N+5][N+5],a[N+5][N+5];

inline ll read()
{
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

void init()
{
    for(int i=0;i<=N;i++) C[i][i]=C[i][0]=1;
    for(int i=1;i<=N;i++) for(int j=1;j<i;j++)
    {
        C[i][j]=(C[i-1][j]+C[i-1][j-1])%k;
        if(C[i][j]==0) a[i][j]++;
    }
    for(int i=1;i<=N;i++) for(int j=1;j<=N;j++)
        sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
    
}

int main()
{
    t=read();k=read();
    init();
    while(t--)
    {
        n=read();m=read();
        printf("%lld\n",sum[n][m]);
    }
    return 0;
} 

 

posted @ 2018-11-06 21:21  安月冷  阅读(209)  评论(0编辑  收藏  举报