zoukankan      html  css  js  c++  java
  • Rinne Loves Xor

    题意:

    分析:

    如果直接暴力算的话,复杂度:(O(N^2)),肯定不行。
    一开始以为要用什么多项式的相关算法,看了别人的思路才发现可以从二进制位的角度考虑,算每个位的贡献是多少。
    对于 (a[i]),它会和 (b[1] o b[i-1]) 依次异或,那么单独考虑每一位。对于第 (k) 位,当 (a[i]) 的第 (k) 位为 (1) 时,当有一个 (b)(k) 位为 (0),就会对答案贡献 (2^k)。在递推的时候计数即可。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    const int N=1e5+5;
    int a[N],b[N],A[40][2],B[40][2];
    ll c[N];
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]);
        c[0]=0;
        for(int i=1;i<=n;i++)
        {
            c[i]=c[i-1]+(a[i]^b[i])%mod;
            for(int j=0;j<=30;j++)
            {
                int t=(a[i]>>j)&1;
                c[i]=(c[i]+1LL*B[j][1-t]*(1<<j)%mod)%mod;
                t=(b[i]>>j)&1;
                c[i]=(c[i]+1LL*A[j][1-t]*(1<<j)%mod)%mod;
                A[j][(a[i]>>j)&1]++;
                B[j][(b[i]>>j)&1]++;
            }
        }
        for(int i=1;i<=n;i++)
            printf("%lld%c",c[i]%mod,i==n?'
    ':' ');
        return 0;
    }
    
    
  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/12802296.html
Copyright © 2011-2022 走看看