/*
搶名額第一場 GG
"我什麼都不會阿"
這場磕死在E題了
按說應該能想到費馬小定理 畢竟p is a prime
別的隊都過了 你們都比較熟悉的就只有這一個
而後還有I題一開始尺取有個思路,而後很快找出bug
這時沒換思路而是補了一下這個bug 就加個if
而後瘋狂wa4 策略不對
其實wa個幾發就該意識到思路有問題了
可是仍是一直懟 不合理
積累經驗了就 下場注意
*/
/*
先看E題吧 打表猜想答案2^(2^n-n)%p
指數 不能mod 根據費馬小定理 2^(p-1)%p==1
每p-1個2乘起來對答案沒有貢獻 因此指數%p-1
另外p==2的時候 2和p不互質 特判一下
*/
#include<iostream>
#define ll long long
using namespace std;
ll n,k,p,ans;
ll Mi(ll a,ll b,ll c){
if(b==0)return 1;ll res=Mi(a,b/2,c);
res=res*res%c;if(b&1)res=res*a%c;return res;
}
int main(){
cin>>n>>k>>p;ans=Mi(2,(Mi(2,n,p-1)-n%(p-1)+p-1)%(p-1),p);
if(k==0)ans=(ans-1+p)%p;if(p==2)ans=0+(k==0);cout<<ans<<endl;return 0;
}
/*
I題 根據題目的指引 應該是在線作 每次嚴格On
On的算法無非就是貪心尺取和單調隊列
這題對於每一個區間答案是r+l-1-(p[r]-p[l-1])+k-(p[r]-p[l-1])
pi是前綴1的個數 化簡後 r-2p[r]+1+k+2p[l-1]-l
枚舉r 維護合法的l的最優值 合法的l必須有 p[r]-p[l-1]<=k
一開始想的尺取,就是想找到每一個合法的區間而後按上面的算一遍,可是這樣會漏下一些
舉個比方
111111111111111001111111111101111111111100111111111001111111111111100
8
9
這組 頭指針和尾指針只會找合法的儘可能長的區間,可是咱們還有一種把0拿過來的操做,須要一些合法的比較短的
目前還沒想到怎麼改....
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 1000010
using namespace std;
int n,m,q[maxn],p[maxn],hea,tai,ans;
char s[maxn];
int main(){
scanf("%s%d",s+1,&m);n=strlen(s+1);
for(int i=1;i<=n;i++)p[i]=p[i-1]+s[i]-'0';
while(m--){
int k;scanf("%d",&k);hea=tai=0;ans=0;
for(int i=1;i<=n;i++){
while(hea<tai&&2*p[q[tai]-1]-q[tai]<=2*p[i-1]-i)tai--;
q[++tai]=i;
while(hea<tai&&p[i]-p[q[hea+1]]>k)hea++;
ans=max(ans,i-2*p[i]+1+k-q[hea+1]+2*p[q[hea+1]-1]);
}
printf("%d\n",min(ans,n-p[n]));
}
return 0;
}