在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。
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"); } } }