求助一道自己想到的题
  • 板块学术版
  • 楼主jifbtDinshey
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/31 16:50
  • 上次更新2023/10/27 04:43:28
查看原帖
求助一道自己想到的题
103171
jifbtDinshey楼主2022/10/31 16:50

已知 xx,将 x(xa)+bx \gets (x \oplus a) + b 执行 tt 次, tt 可能很大。求最后 xx 的值。

问一下大家有什么思路。

(以下内容写得很复杂,可以不看。)

我的想法是做操作 x(xa)+b)ax \gets (x \oplus a) + b) \oplus a,再做 xx+bx \gets x + b。前者相当于 bb 中为 11 的二进制位,在 xx 的对应位被加时,为 00 则进 11 并变为 11,为 11 则变为 00

然后解决 b=2nb = 2^n 的情况,并推广到一般。用一下程序对 x=0,a=3,5,7,9,11,13,b=64,t1000x=0, a=3,5,7,9,11,13, b=64,t\le1000 作图如下:

#include<bits/stdc++.h>
using namespace std;
int x,a,b,t;
int main(){
	cin>>x>>a>>b>>t;
	while(t--){
		x=((x^a)+b)^a;
		cout<<x<<endl;
		x+=b;
		cout<<x<<endl;
	}
	return 0;
}

可以发现折线呈锯齿状。具体说,把每一项减去 atat 得:

但是 aa 很大时锯齿也会很复杂,求出它的复杂度较大。

2022/10/31 16:50
加载中...