哦牛的还有这种题目的。

来源于并非神秘模拟赛。

其它待更新!111

Hack

fun fact:一开始是对标 APIO2025 的 hack 做的。结果发现比 APIO 的 hack 还魔怔。

交互库有 \(u,v,k,r,q\) 几个不告诉你的变量和一个告诉你的 \(mod\),每次你可以询问一个 \(2\times2\) 的矩阵 \(A\),交互库会先令 \(A_{u,v}\gets (k(\sum_{i,j}A_{i,j})+r)\bmod mod\) 然后快速幂求 \(A^q\)均在模意义下)。交互库会告诉你这次询问使用的时间(认为只有乘法运算需要花时间,且 \(a\times b\) 的代价为 \((\lfloor\log_2a\rfloor+1)(\lfloor\log_2b\rfloor+1)\))。
你可以最多询问 \(50000\) 次,最后你要求出 \(u,v,q\)。特别地,你可以给出 \(500\)\(q\) 的可能取值,只要一个正确即可。
\(0\le u,v<1,1\le k,r,q<mod<2^{31}\)\(k,r,q,u,v\) 均在范围内随机生成
快速幂实现方式:

for(int i=0;i<31;++i){
    if(q>>i&1)B=merge(B,A);
    A=merge(A,A);
}

首先找出 \(u,v\)。问一个全零的矩阵,如果 \((u,v)\) 满足 \(u\neq v\)\(A\) 自己平方时整个序列就全部变为 \(0\) 了。否则至少有一个地方有值。可以根据用时分开。

然后考虑将 \(A\) 某位变成随机值,这样 \(A\) 内就最多有两个位置有值了。同样可以分析一下操作次数。

然后接下来是比较牛(还是魔怔?)的部分。

首先发现题目没让你求 \(k,r\),同时你发现求 \(k,r\) 是困难的。因此干脆不求,假装 \(A_{u,v}\) 处是个随机值。

对于一个固定的矩阵 \(A\)\(A\) 自乘的开销是固定的,而只有 \(A\) 乘到 \(B\) 上才与 \(q\) 有关。考虑分别求出 \(q\) 每一位能否取到。此时我们需要使得 \(A\) 在此时乘到 \(B\) 上去和 \(A\) 在其它时刻乘到 \(B\) 上去的开销不同。可以考虑专门构造一个 \(A\) 满足在特定位置所有值都很小,而其它位都很大。

比如此时 \((u,v)=(1,0)\),那么考虑 \(A_{0,0}\) 为我们随机的一个数,其它部分为 \(0\)。模拟一下 \(A_{1,1}\) 的变化,当 \(A_{1,1}\) 足够小时这个位置就是可以区分的。此时调用一下交互库观察用时是否存在显著差异即可。

但一般来说随出来的数可能有多个位置很小,此时认为这些位置会等概率出现在 \(q\) 中。最后对结果加权贡献即可。

\((u,v)\) 在其它地方也是类似的。

至此,一锤定音。尘埃,已然落定。

posted @ 2025-06-30 16:59  UniGravity_qwq  阅读(104)  评论(1)    收藏  举报