Day 5
感觉得调整一下作息,vp AT 的时间不能太晚
赛时又有点意识不清醒了,明明这场的 D 着实不难的(
A
A - Tax Included Price (atcoder.jp)
(A)每增加1,里面那个(frac{100+t}{100}A)就会增加(1 < frac{100+t}{100} <2),于是导致$lfloor frac{100+t}{100}A floor $增大 1 或者 2
增加1没什么,增加2那显然中间会跨过一个值,同时使得(lfloor frac{100+t}{100}A floor - A)增大1
于是我们去二分找最小的x满足(lfloor frac{100+t}{100}x floor - x=n),那么答案就是(lfloor frac{100+t}{100}x floor-1)
Submission #23499797 - AtCoder Regular Contest 118
B
B - Village of M People (atcoder.jp)
要求最小化(max|frac{b_i}{m}-frac{a_i}{n}| = max |frac{b_in-a_im}{nm}|),忽略常量分母,最小化整数(max|b_in-a_im|)即可
二分差值x,这样就限定了(b_i)的取值范围,令(L_i=max(lceil frac{a_im-x}{n} ceil,0),R_i=lfloor frac{a_im+x}{n} floor),即需要满足(L_i le b_i le R_i)
判断是否满足(sum L_i le m le sum R_i)即可判断可行性,构造一组解的时候就先都取(L_i)再酌情往上加即可,时间复杂度(O(k log (nm)))
Submission #23500173 - AtCoder Regular Contest 118
官方题解还给了一种贪心的思路,假设我们不强制要求(b_i)为整数,那么问题就很简单了,直接按比例换算即可,令(b_i=frac{a_im}{n})即有差值为0
考虑先暂且下取整$b_i=lfloor frac{a_im}{n} floor (,然后我们显然需要令其中的)k=m-sum b_i$个数增大1
只要按照(b_in-a_im le 0)从小到大排序,然后选择前k个最小的即可
C
算是一道思路巧妙的打表题
要求满足(1)任意两个数不互质(2)所有数的公约数为1,简单思考不难构造这样一组解:({2 imes3,2 imes5,3 imes5})
考虑如何扩大这组解,(2)时刻满足所以只要保证(1)就可以。发现只要再放入的数至少含有({2,3,5})这3个质因数中的某2个即可,打表发现(10000)以内这样的数有(2666)个(含已经放进去的那3个),于是这道题就这样(很离谱地)做完了
Submission #23500424 - AtCoder Regular Contest 118
D
D - Hamiltonian Cycle (atcoder.jp)
这几天做的 D 里面最简单的一个了,可惜赛时被细节杀了
转化一下题意就是有标号([1,p-1])的点,然后对于每个(x)要连双向边((x,ax),(x,bx)),求哈密顿回路
诶这个我知道这不就是【UNR #4】挑战哈密顿 - 题目 - Universal Online Judge (uoj.ac)
首先根据费马小定理显然有(a^{p-1} equiv 1 pmod{p}),然后如果接触过一些阶和原根的相关知识的话,也不难想到反复乘(a)的周期(ca)一定满足(ca|p-1)(没接触过这个也挺显然的)
于是关于这张图的一个基本的观点是:若只单独考虑(a),那么整张图相当于是由(frac{p-1}{ca})个长度为(ca)的环构成的,只考虑(b)也同理,但关键是如何将这二者结合起来看
首先能注意到图的一个相似性,由于乘a乘b的先后顺序不会影响最后的落点,如果以(a)的环为参考系,那么(b)的每一个环所穿过(a)的环的顺序一定是相同的,而且与(a)的环的交点是等距的,也就说(b)的每个环在(a)的参考系下是平行的。所以我们只考虑(b)的某一个环即可
冷静整理思考一下,不难发现有解的一个必要条件是:任意一个(b)的环都必须要穿过(a)的每一个环
也就是,先把图分割成若干个(a)的环,然后当我们在某个环(x)的某个点(u)上乘(b)后它必须落在另一个环上,并且反复乘(b)的话它能够经过每一个环再回到环(x)(但不一定回到点(u))
上述是从图论角度理解的,如果从数论角度来解释,有解的必要条件为:
取集合(C={a^i|i ge 0}),然后令(n=|C|),(m ge 1)为最小的满足(b^m in C)的数,则应当有(nm=p-1)
下面我们证明,如果满足了这个必要条件,我们一定可以构造出一组解,也就是说这个条件其实是充要的
(forall x in [1,p-1]),一定存在唯一的一组(iin[0,n-1],jin[0,m-1])使得(x=a^ib^j),也就是形成双射
证明:假设(x=a^{i_1}b^{j_1}=a^{i_2}b^{j_2}),那么有(a^{i_1-i_2}=b^{j_1-j_2} in C),于是(m|j_1-j_2)与假设矛盾,即每个(x)唯一对应一组(i,j);然后每个(i,j)也显然唯一对应一个(x)
因此我们可以断定(forall xin[1,p-1]),都唯一对应着(n*m)网格图上的某一个点,这与我们在上面图论角度的猜想是一致的
而且(n*m=p-1),当(p>2)时(n)和(m)中一定有一个是偶数,对其构造哈密顿回路方法多种多样,这里不多加赘述
如果(n)和(m)中有某一个数为1,特判一下这种情况,走到终点然后由周期性再回到起点即可
PS1:在代码中,只要求出n然后假设m=(p-1)/n,正常构造即可,如果中间走着走着出现了重复说明假设有误返回无解,这样代码可能会好写一些(?),不过各自求出n、m也不是多难的事情好像
PS2:不开long long
见啥来着......