Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum (二进制,前缀和)

-
题意:有两个\(01\)字符串\(a\)和\(b\),每次让\(a\)和\(b\)进行与运算,将值贡献给答案,然后将\(b\)右移一位,直到\(b=0\).
-
题解:因为\(a\)不变,而\(b\)每次右移一位,所以我们看\(b\)中\(1\)的位置在\(a\)中所对应的位置,从该位置到最低位,所有为\(1\)的位置都要算一次十进制的数贡献给答案,那么为了降低复杂度,很明显,我们使用前缀和,用十进制记录\(a\)中从低位到高位的和,然后再从低位到高位遍历\(b\),累加所有\(1\)位置在\(a\)所对应的前缀和.
-
代码:
int n,m; string a,b; ll v[N]; ll fpow(ll a,ll k){ ll res=1; while(k){ if(k&1) res=res%mod*a%mod; a=a*a%mod; k>>=1; } return res; } int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>m; cin>>a>>b; reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); for(int i=0;i<n;++i){ if(a[i]=='1'){ v[i]=fpow(2,i); } } for(int i=0;i<m;++i){ v[i]+=v[i-1]; } ll ans=0; for(int i=0;i<m;++i){ if(b[i]=='1'){ ans+=v[i]; ans%=mod; } } cout<<ans<<endl; return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号