RP 計算 (rp)(xor+差分)


在CSP初賽后,chen03的RP快用完了。

RP是個神奇的東西。具體來說,chen03的RP值可以用二進制正整數a和十進制正整數n表示。他的RP值可以表示為
RP=axor(a<<1)xor(a<<2)xor...xor(a<<(n-1))。

其中a<<i表示將a左移i位,xor表示按位異或運算。

chen03想知道他的RP值是多少。

注:
1.將a左移i位,即在a后添加i個0,也可以看成a×2i,在C++中的運算符為<<;
2.按位異或:在二進制下,對兩個數的每一位進行異或運算,並把結果放到答案的當前位上,在C++中的運算符為^。異或,即兩個值同為1或同為0時結果為0,否則為1。

輸入

共兩行,第一行一個二進制正整數 a(保證不含前導 0),第二行一個十進制正整數 n,意義如題目描述。

輸出

一行一個二進制正整數,表示 chen03 的 RP 值。答案不用取模。

樣例輸入 Copy

100001001
4

樣例輸出 Copy

111101110111

提示

00001001中最右邊一個是1,如果進行這個操作

,則從右邊數第1個到第i-n+1個都加上1,最后判斷1的個數
就是 這個操作的時候可以用查分優化
出現奇數個1xor起來就是1
偶數就是0

 

 
 
#pragma GCC optimize(2)
#include <iostream>
#include <string>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
typedef long long ll;
ll read(){
    ll x=0; ll f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
using namespace std;
const int maxn=3e6+100;
const ll INF=1e18;
char a[maxn];
char c[maxn];
int b[maxn];
int sum[maxn];
int m;
int main(){
    scanf("%s",a+1);
    cin>>m;
    int len=strlen(a+1);
    for(int i=1;i<=len;i++){
        c[i]=a[len+1-i];
    } 
    for(int i=1;i<=len;i++){
        if(c[i]=='1'){
            b[i]++;
            b[i+m]--;
        }
    }
    for(int i=1;i<=len+m;i++){
        sum[i]=sum[i-1]+b[i];
    }
    for(int i=len+m-1;i>=1;i--){
        if(sum[i]%2==1){
            printf("1");
        }
        else{
            printf("0");
        }
    } 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM