[noip2016]组合数问题 题解
来源:互联网 发布:淘宝买家怎么快速升钻 编辑:程序博客网 时间:2024/05/26 02:21
D2T1,从理论上来讲不算太难啊,但考场没有多少人做出来就十分尴尬了。或许是心理原因吧。
其实就是求一个组合数,由于除数是确定的,所以可以杨辉三角递推。然后为了处理询问,二维前缀和维护一下就好了。
#include<bits/stdc++.h>#define N 2000using namespace std;int f[N+5][N+5],tmp[N+5][N+5],T,p,n,m;int sum[N+5][N+5];inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline int read(){ int x=0,b=1; char c=nc(); for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1; for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0'; return x*b;}int main(){ freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); T=read(),p=read(); for(int i=0;i<=2000;i++)f[i][0]=f[i][i]=1; for(int i=1;i<=2000;i++) for(int j=1;j<i;j++) f[i][j]=(f[i-1][j]+f[i-1][j-1])%p; for(int i=1;i<=2000;i++) for(int j=1;j<=i;j++) if(f[i][j]==0)tmp[i][j]=1; else tmp[i][j]=0; for(int i=1;i<=2000;i++) for(int j=1;j<=2000;j++) sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+tmp[i][j]; while(T--) { n=read(),m=read(); printf("%d\n",sum[n][m]); } return 0;}
阅读全文
0 0
- [noip2016]组合数问题 题解
- [luogu-2822]noip2016-day2-T1 组合数问题 题解
- [NOIP2016] 组合数问题
- NOIP2016组合数问题
- noip2016组合数问题
- NOIP2016组合数问题
- [NOIP2016]组合数问题
- 组合数问题(NOIP2016)
- NOIP2016 组合数问题
- Noip2016 组合数问题
- noip2016组合数问题
- NOIP2016 Day2T1 组合数问题
- NOIP2016 day2T1 组合数问题
- NOIP2016 T4 组合数问题
- noip2016组合数问题 组合+前缀和
- 洛谷 P2822 [NOIP2016 D2T1] 组合数问题 [90分伪题解]
- 【NOIP2016】洛谷2282 组合数问题
- 【NOIP2016】D2 T1 组合数问题
- 解决virtualBox虚拟机不可使用问题
- [NOIP2017模拟]裁剪表格
- [树链剖分] [bzoj2243] [SDOI2011]染色
- 浏览器渲染机制之DOM树
- java实现map和object互转的三种方法
- [noip2016]组合数问题 题解
- Linux装机必备(centos)
- C++笔记——公有继承、私有继承、保护继承、多重继承
- 堆栈实现表达式求值
- 判断素数
- Linux下安装Redis
- SQL语句备忘录
- Java面试题总结二
- [LeetCode]66. Plus One