传送门
题目:
定义
a
⊕
k
b
a \oplus_k b
a⊕kb表示整数
a
a
a 与
b
b
b的在
k
k
k进制下的不进位加法。特别的,当
k
=
2
k = 2
k=2 时,这一操作可以称为位运算的异或。
给定整数
n
(
1
≤
n
≤
2
⋅
1
0
5
)
n(1 \leq n \leq 2 \cdot 10^5)
n(1≤n≤2⋅105) 和
k
(
2
≤
k
≤
100
)
k(2 \leq k \leq 100)
k(2≤k≤100),现在有一个隐藏的整数
x
(
0
≤
x
≤
n
−
1
)
x(0 \leq x \leq n-1)
x(0≤x≤n−1),你需要在最多
n
n
n次交互内,猜出这个整数。
猜测时,输出猜测的整数
y
(
0
≤
y
≤
2
⋅
1
0
7
)
y(0 \leq y \leq 2 \cdot 10^7)
y(0≤y≤2⋅107) ,系统会视情况返回不同的整数
r
r
r:
若
x
=
y
x = y
x=y,则
r
=
1
r = 1
r=1;
若
x
≠
y
x \neq y
x=y ,则
r
=
0
r = 0
r=0 ,且
x
x
x 会变成
z
z
z,满足
x
⊕
k
z
=
y
x \oplus _k z=y
x⊕kz=y
且
2
≤
k
≤
100
2≤k≤100
2≤k≤100
第一次遇到交互题……很懵
大致思路:
整理柿子:
代码:(用cin 、cout可以不加fflush(stdout);)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=3e6+10;
int k;
int add(int a,int b){
int res=0;
for(int base=1;base<=max(a,b);base*=k){
int aa=a/base%k;
int bb=b/base%k;
res+=(aa+bb)%k*base;
}
return res;
}
int sub(int a,int b){
int ret=0;
for(int base=1;base<=max(a,b);base*=k){
int aa=a/base%k;
int bb=b/base%k;
ret+=(aa-bb+k)%k*base;
}
return ret;
}
int main(){
int t,n,r,y;cin>>t;
while(t--){
cin>>n>>k;
for(int i=0;i<n;i++){
if(i==0)y=0;
else if(i&1)y=sub(i-1,i);
else y=sub(i,i-1);
cout<<y<<endl;
cin>>r;
if(r==1)break;
}
}
return 0;
}