蓝桥杯-异或变换

蓝桥杯-异或变换

题目描述

小蓝有一个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=s1s2s3...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=si1si
请问,经过 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 1n100,1t1000

对于 80% 的评测用例, 1 ≤ n ≤ 1000 , 1 ≤ t ≤ 1 0 9 1 ≤ n ≤ 1000, 1 ≤ t ≤ 10^9 1n1000,1t109

对于所有评测用例, 1 ≤ n ≤ 10000 , 1 ≤ t ≤ 1 0 18 1 ≤ n ≤ 10000, 1 ≤ t ≤ 10^{18} 1n10000,1t1018

思路

通过打表得到一个长度为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;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值