返回顶部

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;
    }
    
posted @ 2020-07-11 23:02  _Kolibri  阅读(136)  评论(0)    收藏  举报