涂色游戏

涂色会覆盖之前,因此只需要记录每个格子涂色的时间戳,就可唯一确定最终颜色。

幂次

11nn 中,有多少正整数 xx 可以被表示为 x=abx = a^b 的形式,其中 a,ba, b 都是正整数,且 bkb \geq k

对于所有数据,保证 1n10181 \leq n \leq 10^{18}1k1001 \leq k \leq 100

此题的关键点就是 nn 的范围很大,因此我们考虑容斥。

对于 k=1k=1,有 n1\sqrt[1]{n} 个,已经包含所有数,无需在讨论后续。

对于 k=2k=2,有 n2\sqrt[2]{n} 个,约有 1e91e9 个,但是我们知道 对于 1n1-n 中共有 n2\lfloor\sqrt[2]{n}\rfloor 个平方数,这类似于 1n1-n 中共有 nk\lfloor \frac{n}{k} \rfloor 个 k 的倍数,因此只要把对于 k>2k>2 的重复统计的容斥掉即可。

对于 k>3k>3,有 n3\sqrt[3]{n} 个,是 1e61e6 因此暴力枚举即可。

对于k>3记得记录1的贡献\color{red}{对于k>3记得记录1的贡献}

这是在优化暴力枚举+基础数论知识。

复杂度 O(n3)O(\sqrt[3]{n})这个非常不严谨,但是我不会算了。

还有更优秀的解法,但是不好想

gig_i[1,n][1,n] 中,x=aix=a^i 的个数,显然 gig_ini\sqrt[i]{n}

fif_i[1,n][1,n] 中,x=aix=a^i 但是对于 j>ij>ixjxix_j \neq x_i

因此答案为

ans=i=k60fians= \sum_{i=k}^{60}f_i

因为 260>1e182^{60}>1e18,所以到 6060 即可。

因此求得 fif_i 只需容斥即可。

fi=giidx=2kfi×idxf_i=g_i-\sum_{idx=2}^{k}f_{i\times idx}

含义就是减去所有可以组成他的次幂,因为 aia2ia^i \supseteq a^{2i},所以容斥掉即可。

对于1我们默认先删除,到最后答案+1即可\color{red}{对于1我们默认先删除,到最后答案 +1 即可}

1
2
3
4
5
for(long long i=60;i>=k;i--){
f[i]=pow<long double>(n,1.0/i)-1;
for(ll j=i*2*;j<=60;j+=i) f[i]-=f[j];
ans+=f[i];
}

复杂度 O(klogk)O(k \log k)

圣诞树

逆时针编号依次给定凸包的坐标,让球从凸包最高点 mm 最终走完所有顶点的最短距离。

逆时针是对写 dpdp 方便的。

最小生成树是假做法\color{red}{最小生成树是假做法}


显然这是假的。

考虑正解,对于给定了起点,我们先猜测若路径有交叉,显然不是最优,可以四边形不等式即可证明。

对于至高点两边,在同一侧运动显然是每次直走一个编号的距离,这样一定是最优的,因为隔着走肯定还得返回,路径必然有相交,而且肯定是从最高点每次走离自己比较近的点,依次向下,证明显然。

这题在求出最优的同时还有求解路径,还要保存路径,这个只需在每次转移最优的时候记录一下,最后逆推即可。

因为一直是向前走,dpdp 无后效性可以记录路径。

因此考虑区间 dpdp

fi,j,0/1f_{i,j,0/1} 表示为已经走了 i+ji+j 步,至高点左边已经选了 ii 个节点,右边已经选择了 jj 个节点当前在左边0还是右边1的最短路径。
一下对于不合法编号自动考虑 +n+nn-n 成为合法的。

fi,j,0=min(fi1,j,0+dist(m+i1,m+i),fi1,j,1+dist(m+i,mj))fi,j,1=min(fi,j1,1+dist(mj+1,mj),fi,j1,0+dist(m+i,mj)) f_{i,j,0}=min(f_{i-1,j,0}+dist(m+i-1,m+i),f_{i-1,j,1}+dist(m+i,m-j))\\ f_{i,j,1}=min(f_{i,j-1,1}+dist(m-j+1,m-j),f_{i,j-1,0}+dist(m+i,m-j))

显然是合法且保证正确的。

密码锁

给定一个锁,对于每个拨圈可以上下依次移动。

对于 1ik1 \leq i \leq k,定义密码锁第 ii 行的松散度为

c(i)=maxj=1nai,jminj=1nai,jc(i) = \max \limits _ {j = 1} ^ n a _ {i, j} - \min \limits _ {j = 1} ^ n a _ {i, j}

同时定义整个密码锁的松散度为

C=max1ikc(i)C = \max \limits _ {1 \leq i \leq k} c(i)

求最小的 CC 值。

对于所有数据,保证 1T1 \leq T1k41 \leq k \leq 41ai,j3×1041 \leq a _ {i ,j} \leq 3 \times 10 ^ 4


考虑随机化,对于该问题我们最难确定的就是对这个矩阵,我们对于其中任意一个元素都难以确定其位置,那我们就考虑先固定住一列,剩下的列在求解,多随机几次一定能获得正解,因为随机一次的复杂度仅有 nk2nk^2,随机 400400 次这一定是可以获得正解的。

随机就是写个随机,模拟求解一下答案

1
mt19937 g(chrono::_V2::steady_clock::now().time_since_epoch().count());
正解,先鸽了\color{green}{正解,先鸽了}

__END__