UOJ Logo Universal Online Judge

UOJ

#443. 【集训队作业2018】不可名状

附件下载 统计

这是一道交互题

题目描述

「你有一万个理由和你们队的画风不太一样

「最简单的理由:你太菜了

「哈哈哈哈哈哈哈」

rehtienairrats 也在玩猜数游戏。

规则是这样的: rehtien 先想一个数 x ,然后 airrats 进行猜测,如果猜对了, rehtien 就会帮她出题。

但很快, airrats 就意识到了问题:「你都不让我二分,我怎么猜?」因此 airrats 规定 |x|=1 ,这样她就有 12 的概率猜中了。

因此当下一轮游戏结束后, rehtien 告诉她, xC ,而他想的数是 i 时, airrats 非常生气。她觉得有必要使用一些玄妙的方法。

任务介绍

具体地, airrats 有一个长为 2n 的数组,初始 a0=1 ,其余为 0 。

她要实现一个函数 SOL(t) ,其中 t 为子任务编号。函数返回一个复数,表示 x

她可以调用如下函数:

INI(n) 其中 1n16 。该函数须在调用下文的函数前调用恰一次 ,表示初始化一个长为 2n 的数组。

CU(d,k) 其中 0d<n,216<k<216 。调用该函数后,对于所有二进制第 d 位为 1 的 i ,令 ai=xkai 。随后 ai 更新为 ai

CR(d1,d2,A) 其中 0d1,d2<nA 是一个 2×2 的复数矩阵,满足 AA=I ,其中 I 为单位矩阵, AA 的共轭转置。调用该函数后,对于所有二进制第 d1,d2 位均为 1 的 i ,令

{ai2d2=A0,0ai2d2+A1,0aiai=A0,1ai2d2+A1,1ai

随后 ai2d2 更新为 ai2d2ai 更新为 ai

ACR(A) 其中 A 指向一个 2n×2n 的复数矩阵,满足 AA=I 。调用该函数后,令 ai=j=02n1Ai,jaj ,随后 ai 更新为 ai 。 如果需要调用该函数,请注意时空复杂度。

QR()会随机返回一个 [0,2n) 间的整数,返回 i 的概率为 |ai|2j|aj|2

实现细节

源代码需要包含头文件 unnamable.h

涉及到的函数接口如下:

complex<double> SOL(int t);
void INI(int n);
void CU(int d,int k);
void CR(int d1,int d2,complex<double> A[2][2]);
void ACR(complex<double> **A);
int QR();

详见样例程序 sample.cpp 。关于上述函数的具体实现,详见 grader.cpp

下发的 grader 将从 input.txt 中读入三个整数 ans,seed,typ ,分别为本组数据的答案、随机种子和子任务编号,其中 ans 表示 x=ω65536ans 。运行结束后,运行结果与错误信息将会被输出至 result.txt

限制与约定

在每组数据中, SOL() 将会被调用一次。令 resSOL() 的返回值, 当 |resx|105 时视为正确。

对于所有数据,CU,CR,QR,ACR 的总调用次数不能超过 300 。

子任务编号分值限制性质
19QR 调用次数不超过 1 次x{1,1}
217x{ω8k}
336QR 调用次数不超过 1 次x{ω512k}
438QR 调用次数不超过 1 次x{ω65536k}

 

其中 ωn 表示 n 次单位根,k 为整数。

满足 AA=I 的矩阵被称为酉矩阵

时间限制2s

空间限制256MB

选手程序与交互库共享本题的时空限制,但由于 ACR 操作的存在,我们不能保证交互库的运行时间。最终评测使用的交互库(只保证)各函数的实现方式与下发的 grader 相同,请自行计算实际运行时间与内存。

交互式类型的题目怎么本地测试

下载

交互库下载