zoukankan      html  css  js  c++  java
  • JZOJ5149 超级绵羊异或

    对于异或来说,某一位的数字1出现的次数如果是奇数次,那么偶数个1就会进行异或变成0,还剩下一个1,那么1无论和几个0进行异或都是1
    也就是说只需要计算每一位出现的次数是奇数还是偶数,奇数的话,那么就表示答案该位为1,否则为0

    对于每一位的统计,
    第k位的贡献值是(lfloorfrac{a + bi}{2^k} floor mod 2)
    也就是变成了类欧几里得模板
    时间复杂度(O(62logn))

    #include <iostream>
    #include <cstdio>
    #define ll long long
    using namespace std;
    const int mod = 2;
    ll f(ll a, ll b, ll c, ll n) {
        ll ans = 0;
        if(!a) ans = (b / c) * (n + 1) % mod;
        else if(a >= c || b >= c) {
            ll pre = f(a % c, b % c, c, n);
            ans = (pre + n * (n + 1) / 2 % mod * (a / c) % mod + (n + 1) * (b / c) % mod) % mod;
        }else {
            ll m = (a * n + b) / c;
            ll pre = f(c, c - b - 1, a, m - 1);
            ans = (n * (m % mod) % mod - pre + mod) % mod;
        }
        return ans;
    }
    void solve(){
        ll a, b, n;
        scanf("%lld%lld%lld", &n, &a, &b);
        ll ans = 0;
        for(int i = 0; i <= 62; i++) {
            ll base = 1ll << i;
            ll x = f(b, a, base, n - 1);
            if(x == 1) ans += base;
        }
        cout << ans << endl;
    }
    int main(){
        int t; cin >> t;
        while(t--) solve();
        return 0;
    }
    
  • 相关阅读:
    [IOI2013]Dreaming
    Lost Cows
    Mobile Service
    [POI2005]Bank notes
    [CTSC2007]动物园zoo
    [CF1093F]Vasya and Array
    [雅礼集训 2017 Day1]市场
    [APIO2014]序列分割
    [CEOI2004]锯木厂选址
    [APIO2010]特别行动队
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13554383.html
Copyright © 2011-2022 走看看