蓝桥杯-异或变换
题目描述
小蓝有一个01串 s = s 1 s 2 s 3 . . . s n s = s_1s_2s_3...s_n s=s1s2s3...sn。
以后每个时刻,小蓝要对这个01串进行一次变换。每次变换的规则相同。对于01串
s
=
s
1
s
2
s
3
.
.
.
s
n
s = s_1s_2s_3...s_n
s=s1s2s3...sn,变换后的01串
s
′
=
s
1
′
s
2
′
s
3
′
.
.
.
s
n
′
s' = s'_1s'_2s'_3...s'_n
s′=s1′s2′s3′...sn′为:
s
1
′
=
s
1
;
s
i
′
=
s
i
−
1
⊕
s
i
s'_1 = s_1;\\ s'_i = s_{i−1}\oplus s_i
s1′=s1;si′=si−1⊕si
请问,经过 t 次变换后的 01串是什么?
输入描述
输入的第一行包含两个整数 n, t,分别表示 01 串的长度和变换的次数。
第二行包含一个长度为 n 的 01 串。
输出描述
输出一行包含一个 01 串,为变换后的串。
输入输出样例
输入样例 #1
5 3
10110
输出样例 #1
11010
说明
对于 40% 的评测用例, 1 ≤ n ≤ 100 , 1 ≤ t ≤ 1000 1 ≤ n ≤ 100, 1 ≤ t ≤ 1000 1≤n≤100,1≤t≤1000。
对于 80% 的评测用例, 1 ≤ n ≤ 1000 , 1 ≤ t ≤ 1 0 9 1 ≤ n ≤ 1000, 1 ≤ t ≤ 10^9 1≤n≤1000,1≤t≤109 。
对于所有评测用例, 1 ≤ n ≤ 10000 , 1 ≤ t ≤ 1 0 18 1 ≤ n ≤ 10000, 1 ≤ t ≤ 10^{18} 1≤n≤10000,1≤t≤1018 。
思路
通过打表得到一个长度为n的01串的循环节为最小的大于等于n的2整数次幂。那么再求几次模拟即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
typedef long long ll;
int a[N],n;
ll t,C;
string s;
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
string s = "";
cin >> n >> t;
cin >> s;
s = " " + s;
for(int i = 1 ; i <= n ;i ++)
a[i] = s[i] - '0';
C = 1;
while(C < n)
C <<= 1;
t %= C;
while(t--)
{
for(int i = n ; i >= 2 ; i --)
{
a[i] ^= a[i-1];
}
}
for(int i = 1 ; i <= n ; i ++)
cout<<a[i];
return 0;
}