CF1543D1D2(构造,位运算)
CF1543D1D2(构造,位运算)
题意
交互。
猜一个数 ,最多 次询问,每次如果猜测失败,要将 变成 如果设此次猜测数字为 ,则关系表示为 。这里算符表示 进制下的不进位加法。
思路
一开始没仔细看题,看成 写easy版本时候因为异或的自反性还给过了。于是hard版莫明其妙狂wa。。。
对这个式子, 我们先把未知量丢一边,有 这里的 是 的逆。
然后可以写出一个递推式子。
这种时候如果找到一个通项式,也就写完了。
此时有两种想法。一种是硬递归展下去,一种是考虑构造一个 使得 只和 和每次询问数字 有关。
我们考虑 。
则 。考虑将前项元素 消去
令 。代入上式发现 。满足需求
接下来对 。有类似构造 。
从而我们知道,只要对每一项分奇偶讨论,就可以迭代寻找答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<random>
#include<iomanip>
#define yes puts("yes");
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
// #define endl '\n'
#define int long long
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
using namespace std;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x;}
typedef pair<int,int> PII;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;
int get(int x,int y,int k) {
int ans = 0,p = 1;
while(x || y) {
int t1 = x % k,t2 = y % k;
x /= k, y /= k;
ans += (t1 - t2 + k) % k * p;
p *= k;
}
return ans;
}
void solve(){
int n,k; cin >> n >> k;
for(int i = 0;i < n;i ++) {
int t;
if(!i) {
cout << i << endl;
cin >> t;
if(t) return;
}else {
if(i & 1) cout << get(i - 1,i,k) << endl;
else cout << get(i,i - 1,k) << endl;
cin >> t;
if(t) return;
}
}
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】