题目链接:点击查看

题目大意:交互题猜密码,设原密码为 xxx,猜的密码为 yyy,如果没猜到,密码会自适应变成 zzz,满足 x⊕z=yx \oplus z=yx⊕z=y ,最多猜 nnn 次,对于本题而言,所有数字是在 kkk 进制下进行的

题目分析:相对于 easyeasyeasy 版本而言,当异或推广到 kkk 进制时,就不存在自反性了,所以本题还是要稍微推一下公式找找共性

这里的异或就不能称之为异或了,下文中,⊕\oplus⊕ 将视为 “k进制不进位加法”,同样对应一个 ⊖\ominus⊖ 为 “k进制不退位减法”,意义为名称所述。本题中的异或其实就是“k进制不进位加法”,需要提前知道的是,这两个运算同样具有基本运算的交换律和结合律的性质。

开始推公式,假设原答案为 xxx,猜的密码为 yyy,新密码为 zzz,因为满足 x⊕z=yx \oplus z=yx⊕z=y,两侧同时“不进位减去x”,得到 z=y⊖xz=y \ominus xz=y⊖x

假设第 iii 次询问的值为 qiq_iqi​,密码为 passwordpasswordpassword,第一次询问后,原密码变成了 q1⊖passwordq_1 \ominus passwordq1​⊖password;第 kkk 次询问后,原密码变成了 qk⊖(qk−1⊖...(q2⊖(q1⊖password)))q_k \ominus(q_{k-1}\ominus...(q_2 \ominus (q_1 \ominus password)))qk​⊖(qk−1​⊖...(q2​⊖(q1​⊖password))),这里还是令 q1=0q_1=0q1​=0

所以假如我们第 iii 次猜,想要猜原密码是否和 xxx 相等,也就是 password==xpassword==xpassword==x 是否成立,就必须令 qi=qi−1⊖(qi−2⊖...(q2⊖(q1⊖x)))q_i=q_{i-1} \ominus(q_{i-2}\ominus...(q_2 \ominus (q_1 \ominus x)))qi​=qi−1​⊖(qi−2​⊖...(q2​⊖(q1​⊖x)))

现在问题是如何快速求出 qiq_iqi​。根据结合律,不难将 xxx 单独拿出来,然后整个式子就变成了:qi=qi−1⊖(qi−2⊖...(q2⊖q1))opxq_i=q_{i-1} \ominus(q_{i-2}\ominus...(q_2 \ominus q_1))\ \ op\ \ xqi​=qi−1​⊖(qi−2​⊖...(q2​⊖q1​))  op  x,这里的 opopop 代表的是一个符号,这里先按下不表。不难看出 opopop 前面的部分可以线性维护得到。而后面单独拆出来的 xxx,因为遇到减法拆括号时需要变号,“不进位减法” 在这里也是同理,所以当询问的下标为奇数时,opopop 为 ⊖\ominus⊖,当询问的下标为偶数时,opopop 为 ⊕\oplus⊕

然后自己模拟一下 ⊕\oplus⊕ 和 ⊖\ominus⊖ 这两个运算就可以了,按照上面的理论,将 nnn 个数字都枚举一遍, 时间复杂度是 O(nlogkn)O(nlog_kn)O(nlogk​n) 的

代码:

// Problem: D2. RPD and Rap Sheet (Hard Version)
// Contest: Codeforces - Codeforces Round #730 (Div. 2)
// URL: https://codeforces.com/contest/1543/problem/D2
// Memory Limit: 256 MB
// Time Limit: 5000 ms
//
// Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2)
// #pragma GCC optimize("Ofast","inline","-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#define lowbit(x) x&-x
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
template<typename T>
inline void read(T &x)
{T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f;
}
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
const int inf=0x3f3f3f3f;
const int N=1e6+100;
int k;
int add(int a,int b) {int ans=0,base=1;while(a||b) {int tmp=(a%k+b%k)%k;ans+=tmp*base;base*=k;a/=k,b/=k;}return ans;
}
int sub(int a,int b) {int ans=0,base=1;while(a||b) {int tmp=(a%k-b%k+k)%k;ans+=tmp*base;base*=k;a/=k,b/=k;}return ans;
}
int main()
{#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--) {int n,sum=0;read(n),read(k);for(int i=0;i<n;i++) {int cur=1;if(i==0) {cur=0;} else if(i&1) {cur=sub(sum,i);} else {cur=add(sum,i);}printf("%d\n",cur);fflush(stdout);int ans;scanf("%d",&ans);if(ans==1) {break;} else {sum=sub(cur,sum);}}}return 0;
}

CodeForces - 1543D2 RPD and Rap Sheet (Hard Version)(交互+模拟)相关推荐

  1. CodeForces - 1543D1 RPD and Rap Sheet (Easy Version)(异或+交互)

    题目链接:点击查看 题目大意:交互题猜密码,设原密码为 xxx,猜的密码为 yyy,如果没猜到,密码会自适应变成 zzz,满足 x⊕z=yx \oplus z=yx⊕z=y ,最多猜 nnn 次 题目 ...

  2. Codeforces Round #730 (Div. 2) D2. RPD and Rap Sheet (Hard Version) 交互 + k进制的转换

    传送门 文章目录 题意: 思路: 题意: 定义a⊕kba\oplus_k ba⊕k​b为a,ba,ba,b在kkk进制下的不进位加法.系统会随机生成一个数xxx,你猜这个数,假设当前猜的数为yyy,如 ...

  3. D1. RPD and Rap Sheet (Easy Version) (交互题+构造)

    题意: 交互题,有一个初始密码xxx,只有nnn次猜测机会,假如猜了yyy,x!=yx!=yx!=y,那么密码就会变成x⨁yx\bigoplus yx⨁y. 题解: 设第iii次猜测的数为pip_ip ...

  4. CodeForces Round #730 D1. RPD and Rap Sheet (Easy Version)题解

    Codeforces Round #730 (Div. 2) 题意: t组数据,每组给一个n和k,(easy version里面k=2) 每一次系统会输入一个初始的密码(初始密码是一个在[0,n−1] ...

  5. Codeforces Round #730 (Div. 2) D1. RPD and Rap Sheet (Easy Version)

    传送门 思路: 假设0到n-1之间的数为密码,则可以想到一个可行的解法: 第一次输出0,之后的每一次都输出(i−1)⊕(i−2)(i-1)⊕(i-2)(i−1)⊕(i−2). 假设答案为x,那么第一次 ...

  6. RPD and Rap Sheet (Hard Version)(交互题,不进位加法、不退位减法)

    传送门 题目: 定义 a⊕kba \oplus_k ba⊕k​b表示整数 aaa 与 bbb的在 kkk进制下的不进位加法.特别的,当 k=2k = 2k=2 时,这一操作可以称为位运算的异或. 给定 ...

  7. Codeforces Round #730 (Div. 2) D. RPD and Rap Sheet (交互,从easy到hard)

    easy hard 题意 已知密码是kkk进制数,在十进制下是[0,n−1][0,n-1][0,n−1]之间,你有至多nnn次机会猜测这个数 设你猜的数字是yyy,如果答案正确,系统会返回111 如果 ...

  8. 【CodeForces 1255E1 --- Send Boxes to Alice [Easy Version]】

    [CodeForces 1255E1 --- Send Boxes to Alice [Easy Version]] Description This is the easier version of ...

  9. CodeForces - 1562D2 Two Hundred Twenty One (hard version)(二分)

    题目链接:点击查看 题目大意:定义一个前缀和公式 a1−a2+a3−a4+-=∑i=1n(−1)i−1⋅aia_1 - a_2 + a_3 - a_4 + \ldots=\sum\limits_{i= ...

最新文章

  1. AI芯片的未来之战:“霸主”英伟达真就无人能挡了吗?
  2. cocos dos命令
  3. 设计模式总结之Builder Pattern(建造者模式)
  4. intellij连接真实spark集群运行wordcount-Java
  5. Android之React native的介绍和入门指南
  6. Filecoin Gas基础费率跌至4.40 nanoFIL
  7. 测试上路2年,你处于什么阶段了?不醒着拼,你连应届生都比不过...
  8. 学生社团管理系统(Java+Swing+mysql)(超简陋)
  9. o2o模式的优势 o2o模式的劣势
  10. 软件测试用例篇总结概述
  11. Windows10创建工作组、加入工作组、查看工作组包含的所有电脑
  12. MyBatis-Plus之面向Mapper编程
  13. vue3使用keep-alive页面切换时报错:TypeError: parentComponent.ctx.deactivate is not a function
  14. linux下filezilla使用教程,FTP工具filezilla使用教程
  15. 微信小程序云函数调用成功result返回null
  16. 安卓搭建http文件服务器,如何在安卓上搭建http服务器
  17. 开源的工作流都有哪些特征?
  18. 【TUM公开数据集RGBD-Benchmark工具evaluate_rpe.py参数用法原理解读】
  19. 罗永浩和王自如的对质怎么看?
  20. 使用MBROSTool 工具制作U盘多启动盘的方法总结

热门文章

  1. Nacos-Nacos和Eureka的对比
  2. Nacos配置管理-nacos集群搭建
  3. HTTP通信协议的组成
  4. canal数据同步(canal安装)
  5. MapReduce分区-原理
  6. Filter_细节_执行流程生命周期
  7. 循环基础-第一个while循环
  8. 逐渐增高_健身能不能增高?真相原来是这样
  9. Versions maven plugin 修改版本
  10. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式