E. Binary Numbers AND Sum
阿新 • • 發佈:2018-10-14
string ORC return 預處理 技巧 problem main 前綴和 結果
鏈接
[http://codeforces.com/contest/1066/problem/E]
題意
給你長度分別為n,m的二進制串,當b>0時,對a,b,&運算,然後b右移一位,把每次a&b的10進制結果累加對 998244353取余
分析
模擬這個過程,但有個技巧就是對b從高位開始求二進制的前綴和
具體看代碼
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long const ll mod=998244353; const ll N=2e5+10; ll one[N],pw[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll i,j,k,n,m; string a,b; //freopen("in.txt","r",stdin); cin>>n>>m; cin>>a>>b; //使位數一致在位數少的前面加0 if(n<m){ a=string(m-n,‘0‘)+a; } else if(m<n){ b=string(n-m,‘0‘)+b; } n=max(n,m); one[0]=(b[0]==‘1‘); for(i=1;i<n;i++) one[i]=one[i-1]+(b[i]==‘1‘);//b高位開始的前綴和 pw[0]=1; for(i=1;i<N;i++) pw[i]=pw[i-1]*2ll%mod;//計算2的冪次預處理 ll ans=0; for(i=0;i<n;i++){ ll res=(a[i]==‘1‘); res=res*pw[n-i-1]%mod;//計算a這個位置的10進制值 ans=(ans+res*one[i]%mod)%mod;//之所以*one[i],是因為b右移的過程,a[i]對應的次數就是b高位開始的前綴和,註意取余mod } cout<<ans<<endl; return 0; }
E. Binary Numbers AND Sum