1. 程式人生 > >JZOJ5243【GDOI2018模擬8.8】超級綿羊異或 類歐幾里得演算法

JZOJ5243【GDOI2018模擬8.8】超級綿羊異或 類歐幾里得演算法

好像沒什麼人去改這題啊。。。
題意:求axor(a+b)xor(a+b2).....xor(a+b(n1))

考慮計算答案的第x位是否為1
那麼對於a+bi,判斷(a+bi)/(1<<k)(整除)的奇偶性,表示看a+bi的第k位是否為1。最終答案的第k位就看sigma((a+bi)/(1<<k))i=0..n1的奇偶性。
是類歐幾里得的模板題。
關於類歐請看http://blog.csdn.net/werkeytom_ftd/article/details/53812718

#include<cstdio>
#include<algorithm>
#include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; typedef long long ll; const int mo=2; int n,m; ll a,b; typedef long long ll; inline ll f(ll a,ll b,ll c,ll n) { if (!a)return (n+1)*(b/c)%mo; if (a>=c||b>=c) { return
((a/c)*n*(n+1)/2+(b/c)*(n+1)+f(a%c,b%c,c,n))%mo; } else { ll m=1ll*(a*n+b)/c; return (1ll*m*n-1ll*f(c,c-b-1,a,m-1)+mo)%mo; } } int main() { freopen("shxor.in","r",stdin); freopen("shxor.out","w",stdout); int cas; scanf("%d",&cas); while(cas--) { scanf
("%d%lld%lld",&n,&a,&b); ll ans=0; fd(x,60,0) { ll c=1ll<<x; if (f(b,a,c,n-1))ans+=c; } printf("%lld\n",ans); } }