2019 cattle off more school nine I. KM and M (category Euclid)

Effect: Given $ N, M $, seeking $ \ sum \ limits_ {K = 1} ^ N \ text {(KM) & M} $

 

Contributions $ I $ considering bits, apparently $ \ lfloor \ frac {KM} {2 ^ i} \ rfloor $ is the number of odd multiplied by $ 2 ^ i $

It is equal to $ 2 ^ i (\ sum \ lfloor \ frac {KM} {2 ^ i} \ rfloor-2 \ sum \ lfloor \ frac {KM} {2 ^ {i + 1}} \ rfloor) $, can be used Europe is determined class

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <bitset>
#include <functional>
#include <random>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
 
 
 
    if (a>=c||b>=c) {
        return (t+(a/c)%P*n%P*(n+1)%P*inv2+(b/c)%P*(n+1))%P;
    }
    ll m = ((__int128)a*n+b)/c;
    return ((n%P)*(m%P)-solve(c,c-b-1,a,m-1))%P;
}
 
int main() {
    ll n, m;
    cin>>n>>m;
    int ans = 0;
    REP(i,0,60) if (m>>i&1) {
        int A = solve(m,0,1ll<<i,n);
        int B = solve(m,0,1ll<<i+1,n);
		int C = (1ll<<i)%P;
        ans = (ans+(A-2ll*B)*C)%P;
    }
    if (ans<0) ans += P;
    printf("%d\n", ans);
}

 

Guess you like

Origin www.cnblogs.com/uid001/p/11416582.html