Contest 984
A
先手取最大,后手取最小,答案就是第 \(\left\lceil\frac{n}{2}\right\rceil\) 小的数。
用 nth_element 可以做到 \(O\left(n\right)\)。
B
模拟,时间复杂度 \(O\left(nm\right)\)。
C
如果约分后 \(q\) 中存在某个质因数 \(b\) 中没有,则无法除尽,比较显然就不证了,可以对着十进制想一想。
但是太大了根号分解质因数会爆炸怎么办?
发现我们并不关心具体的质因数,我们只需要将他们去掉,这不禁让人想到 \(\gcd\)。
于是就有了一个比较慢的做法,\(q\) 每次除以 \(\gcd\left(q,b\right)\),如果 \(\gcd=1\) 了就停下了,此时如果 \(q\) 是 \(1\) 就能整除了。
时间复杂度先鸽着,可能会 \(\texttt{TLE}\)。
考虑能否更进一步优化。在做一次 \(\gcd\) 的时候,我们发现 \(b\) 中有的质因数如果在 \(\gcd\) 中没出现,那么它在 \(q\) 中必定也没出现。也就是说有贡献的质因数一定在 \(\gcd\) 中出现了,所以我们可以直接将 \(b\) 用 \(\gcd\left(q,b\right)\) 替换,这样的时间复杂度先鸽着。
代码贴一下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read()
{
	ll A;
	bool K;
	char C;
	C=A=K=0;
	while(C<'0'||C>'9')K|=C=='-',C=getchar();
	while(C>'/'&&C<':')A=(A<<3)+(A<<1)+(C^48),C=getchar();
	return(K?-A:A);
}
ll gcd(ll _,ll __)
{
	return(!_?__:gcd(__%_,_));
}
bool pd(ll x,ll y)
{
	return(gcd(x,y)==1?x==1:pd(x/gcd(x,y),gcd(x,y)));
}
int main()
{
	int n;
	ll p,q,b;
	n=read();
	while(n--)
	{
		p=read(),q=read(),b=read();
		q/=gcd(p,q);
		puts((pd(q,b)?"Finite":"Infinite"));
	}
	return 0;
}
回寝室的时候问了下马阿克,发现我傻逼了……只要判一下 \(b^{\log q}\) 能否被 \(q\) 整除就好了,这样的时间复杂度是 \(O\left(n\log q\right)\) 的(瓶颈反而在于约分和算出 \(\log q\))。
D
很有趣的一道 DP 题。
对于一个长度为 \(len\) 的区间,被它包含的所有长度小于等于 \(len\) 的区间都能取到。
所以我们可以令 \(a_{i,j}\) 表示长度为 \(i\),以 \(j\) 作为左端点的区间的答案。
发现所有长度小于等于 \(i-1\) 的区间在 \(\left[j,j+i-2\right]\) 和 \(\left[j+1,j+i-1\right]\) 中至少能取到一次。
现在只要解决新加入的一个区间 \(\left[j,j+i-1\right]\),即快速算出 \(f\left(j\to j+i-1\right)\)。
模拟出整个倒三角形,其实 \(f\left(j\to j+i-1\right)\) 就是第 \(i\) 行第 \(j\) 列的数。
时间复杂度 \(O\left(n^2+q\right)\)。
E
卡常好题。
首先要观察到人进入电梯的顺序是固定的,可以搞进状态里。而楼层和容纳人数很少,也可以搞进状态里。
此处要注意,在电梯中,我们只关心一个人的目标楼层,而不关心他的具体编号。
令 \(dp_{now,high,pos1,pos2,pos3,pos4,0/1}\) 表示前 \(now\) 个人,当前楼层为 \(high\),电梯里的四个人的目标楼层(为 \(0\) 代表当前位置没人)以及当前电梯必须向上/下移动。
最后一维是为了防止出现反复横跳的情况。
发现转移比较恶心,不知道具体的转移顺序,考虑记忆化搜索。但问题又来了,\(2000\times 9\times 10^4\times 2=360000000\),这么大的数组拿头开。
此处有两个解决方案:
- 强行限制状态,将目标楼层从大到小排序或者从小到大排序,这样方案数按不同数的个数算一下就是 \(\binom{10}{4}+\binom{10}{3}\times 3+\binom{10}{2}\times 3+\binom{10}{1}=715\)。
只需要开 \(2000\times 9\times 715\times 2=25740000\) 大小的数组即可。 - 滚动数组优化记忆化搜索。依次枚举人,第一维只与上一个有关。所以当前人进入电梯时从上一个转移过来,其它情况直接记搜。
只需要开 \(9\times 10^4\times 2^2=360000\) 大小的数组即可。 
当然你可以两个一起用。
显然的,这两种方法都非常之慢,尤其是第二种。如果你写了第二种的话,要加上四个优化(第一种没试过不清楚):
- 当有人下电梯时,递归下去后直接返回。因为能下电梯显然下,代价一样,这样不会占着位子。
 - 当有人上电梯时,递归下去后直接返回。因为能上电梯显然上,代价一样,避免下次特意回来接。
 - 尽量把递归下去后算出的值存下来,避免再次调用。虽然后面递归时会直接返回,但递归本身非常耗时间。
 - 火车头。
 
前两个加上后可以免去很多多余的取最小值步骤。
时间复杂度 \(O\left(n\right)\),\(2000\) 最慢跑了 \(2979ms\) 你敢信?
另:有直接 DP 的做法,似乎是根据接人送人的顺序来搞的,参考这里。
要看记搜的第一种做法则可以参考这里。
Contest 984的更多相关文章
- CF#483(div2 C)
		
http://codeforces.com/contest/984/problem/C C. Finite or not time limit per test 1 second memory lim ...
 - 【cf 483 div2 -C】Finite or not?(数论)
		
链接:http://codeforces.com/contest/984/problem/C 题意 三个数p, q, b, 求p/q在b进制下小数点后是否是有限位. 思路 题意转化为是否q|p*b^x ...
 - Codeforces Round #483 (Div. 2) [Thanks, Botan Investments and Victor Shaburov!]
		
题目链接:http://codeforces.com/contest/984 A. Game time limit per test:2 seconds memory limit per test:5 ...
 - CF练习记录
		
2018/5/6 Codeforces Round #478 (Div. 2) C http://codeforces.com/contest/975/problem/C Valhalla Siege ...
 - codeforce#483div2C-Finite or not?数论,GCD
		
传送门:http://codeforces.com/contest/984/problem/C 这道题 题意:求q/p是否能用k进制有限表示小数点后的数: 思路:数学推理: 1.首先把q/ ...
 - Codeforces Round #483 (Div. 2)  B. Minesweeper
		
题目地址:http://codeforces.com/contest/984/problem/B 题目大意:扫雷游戏,给你一个n*m的地图,如果有炸弹,旁边的八个位置都会+1,问这幅图是不是正确的. ...
 - 牛客假日团队赛5J	护城河  bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 (凸包的周长)
		
链接:https://ac.nowcoder.com/acm/contest/984/J 来源:牛客网 护城河 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
 - 牛客假日团队赛5 K	金币馅饼 (DP 基础题)
		
链接:https://ac.nowcoder.com/acm/contest/984/K 来源:牛客网 金币馅饼 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
 - 牛客假日团队赛5 L	Catch That Cow  HDU 2717 (BFS)
		
链接:https://ac.nowcoder.com/acm/contest/984/L 来源:牛客网 Catch That Cow 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 3 ...
 
随机推荐
- SQL SERVER迁移--更换磁盘文件夹
			
默认情况下SQL SERVER的安装路径与数据库的默认存放路径是在C盘的--这就很尴尬. 平时又不注意,有天发现C盘的剩余空间比较吃紧了,于是着手想办法迁移文件夹. 一.环境准备 数据库版本--SQL ...
 - 数据结构(C++)——链表
			
顺序表和链表的比较 1.存取方式 顺序表可以随机访问,而链表只能从表头顺序查找.(因此经常查找顺序表某一个元素时,顺序表更适合) 2.逻辑结构与物理结构 顺序表中,逻辑上相邻的元素,其物理存储位置也相 ...
 - SP22343 Norma--序列分治
			
Norma 传送门 题意简化: 定义一个区间的贡献为 \(max*min*len\),求给定序列中所有子区间的总贡献和 题解 考虑 \(O(n*log_2n)\) 的复杂度的做法 数据结构??? yz ...
 - 03 . Gin+Vue开发一个线上外卖应用(用户数据创建,插入,跨域处理)
			
功能和背景介绍 在项目的登录功能中,如果在登录时发现用户名和密码在用户表中不存在,会自动将用户名和密码保存在用户表中,创建一个新的用户. 因此,除了使用手机号和验证码登录以外,还支持使用用户名.密码进 ...
 - Python爬虫练习(多线程,进程,协程抓取网页)
			
详情点我跳转 关注公众号"轻松学编程"了解更多. 一.多线程抓取网页 流程:a.设置种子url b.获取区域列表 c.循环区域列表 d.创建线程获取页面数据 e.启动线程 impo ...
 - python日期与日历Datetime和Calendar模块
			
datetime模块 1.1 概述 datetime比time高级了不少,可以理解为datetime基于time进行了封装,提供了更多的实用的函数,datetime的接口更加的直观,更容易调用 1.2 ...
 - PHP获取文件拓展名的方法
			
1.用strrchar()函数,查找字符串在另一字符串中最后出现的位置,并返回该位置到字符串最后的所有字符(返回结果包括点).即返回拓展名前 点 到结尾的字符,即为扩展名.注意与strchar() ...
 - 团灭 LeetCode 股票买卖问题
			
很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变 ...
 - Git撤销文件修改
			
在旧版本中,git的撤销工作区的文件修改是用git checkout -- <file>命令,由于容易漏了--导致和切换分支混肴,所以新版本中: - 使用git restore (--wo ...
 - 通俗易懂浅谈理解ES6类this不同指向问题
			
1. class Btn{ //定义的一个类 constructor(id){ // constructor是一个构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法.一个类必须 ...