NOIP2016D2T1组合数问题

来源:互联网 发布:大量淘宝买家手机号码 编辑:程序博客网 时间:2024/05/21 20:29

这里写图片描述
题目复制变成乱码0.0 这道题刚开始看上去是很懵很懵的,仔细读题,还是很懵。给的组合数公式基本上没什么用(应该都会算吧。。?) 然后自己手写了一遍C(1,1) 到C(5,5)发现组合数递推式f【i,j】=f【i-1】【j】+f【i-1】【j-1】;
然后我想这题不是水题就秒了嘛?开个long long算一下有几个能被整除,询问用二维前缀和维护,然而并不是这样。。开了long long还是爆了0.0(要是用python算一下会不会爆long long就可以了)。把每个组合数都%k不会影响到整除性。所以可以直接%k,然后就AC了。T1一定要注意细节!细节!还有0xb天就NOIP了~加油~嘘 希望ly的期中考试可以AC呢。

#include<bits/stdc++.h>using namespace std;const int MAXN=100005;long long zuhe[2003][2003];int xw[2003][2003],sum[2003][2003];int t,k,n,m;int main(){    memset(zuhe,0,sizeof(zuhe));    memset(xw,0,sizeof(xw));    memset(sum,0,sizeof(sum));    scanf("%d%d",&t,&k);    for(int i=0;i<=2000;i++){        zuhe[i][1]=i;        zuhe[i][0]=1;    }    for(int i=1;i<=2000;i++)        for(int j=1;j<=i;j++){            zuhe[i][j]=(zuhe[i-1][j]%k)+(zuhe[i-1][j-1]%k);            if(zuhe[i][j]%k==0){                xw[i][j]++;            }        }    for(int i=1;i<=2000;i++)        for(int j=1;j<=2000;j++){            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+xw[i][j];        }    for(int i=1;i<=t;i++){        scanf("%d%d",&n,&m);        if(m>n)m=n;        printf("%d\n",sum[n][m]);       }    return 0;}