NOIP 2016 Senior 4
来源:互联网 发布:2017淘宝刷不了单 编辑:程序博客网 时间:2024/06/10 18:11
这道题。。。其实我第一反应是爆搜。由于组合数的计算有多种公式,思路往往会禁锢,这不,题目故意把公式给了你,让你往这个公式上去想,不超时才怪。。。
在使用该公式进行单行递推时,能够轻松地通过一个点,但是对于10000组测试数据就无能为力了,同时,这种方法还受溢出的限制,因此不可取。如果用这种方法应该能得到60分。
正确的做法应该是使用递推公式。因为递推公式是加法,而通项公式是乘法和除法。加法让求余有了可能。观察发现,题目要求在一开始就输入k,而不是每组数据一个,这更坚定了使用递推公式提前初始化好的信心。
再看数据,发现2000的规模是允许我们以
首先我们来看看如何判断一个组合数是不是k的倍数。很简单,模k后判断是否为0即可。接下来就是查询,这时我们应该很自然地想到了二维和数组,到这里这道题就简单了。记住用之前写的暴力多测试几下!!!= =
参考代码(稍慢,可以根据题目给的n,m的最大值进行优化,还可以把long long改成int,因为懒所以我就不改了)
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <string>#include <stack>#include <queue>#include <deque>#include <map>#include <set>#include <bitset>using std::cin;using std::cout;using std::endl;typedef unsigned long long INT;inline INT readIn(){ INT a = 0; bool minus = false; char ch = getchar(); while(!(ch == '-' || ch >= '0' && ch <= '9')) ch = getchar(); if(ch == '-') { minus = true; ch = getchar(); } while(ch >= '0' && ch <= '9') { a *= 10; a += ch; a -= '0'; ch = getchar(); } if(minus) a = -a; return a;}const INT maxn = 2005;INT mod;INT n, m;INT C[maxn + 5][maxn + 5];INT f[maxn + 5][maxn + 5];void run(){ INT a = readIn(); mod = readIn(); for(int i = 1; i <= maxn; i++) { C[i][0] = C[i][i] = 1; for(int j = 1; j < i; j++) { C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod; } } for(int i = 1; i <= maxn; i++) { for(int j = 0; j <= maxn; j++) { if(j) { f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + (j <= i && !C[i][j]); } else { f[i][j] = f[i - 1][j] + (j <= i && !C[i][j]); } } } while(a--) { INT ans = 0; n = readIn(); m = readIn(); cout << f[n][m] << endl; }}int main(){ run(); return 0;}
阅读全文
0 0
- NOIP 2016 Senior 4
- NOIP 2016 Senior 2
- NOIP 2016 Senior 3
- NOIP 2016 Senior 5
- NOIP 2016 Senior 6
- NOIP 2009 Senior 4
- NOIP 2011 Senior 4
- NOIP 2015 Senior 4
- NOIP 2013 Senior 4
- NOIP 2008 Senior 4
- NOIP 2007 Senior 4
- NOIP 2009 Senior 1
- NOIP 2009 Senior 3
- NOIP 2011 Senior 2
- NOIP 2011 Senior 3
- NOIP 2011 Senior 5
- NOIP 2011 Senior 6
- NOIP 2012 Senior 2
- 二叉树的遍历
- JAXB解析XML文件
- JAVA 集合类(java.util)源码阅读笔记------Vector
- maven,nexus远程仓库地址及其配置
- REDIS安装部署与启动
- NOIP 2016 Senior 4
- Error(spark)1
- HDU 2511 汉诺塔X(递推+DFS)
- CentOS 7设置静态IP
- centos7 安装teamviewer
- OpenCV3.0+VS2013+Windows7开发环境搭建
- windows C++ 遍历目录,获取文件名和文件路径
- supervisord监控服务常用技巧
- android格式布局和videoview