牛客周赛 Round 150
思路:前缀异或的性质+区间等比缩小,缩小的时候,l上取整,r下取整
#include<bits/stdc++.h> #define int long long #define fi first #define se second #define endl '\n' using namespace std; typedef pair<int,int> pii; const int N=1e6+10; const int mod=998244353; vector<int>pm; int judge[N],nm[N],inv[N]; int Log2[N]; int kmi(int a,int b){ int res=1; while(b){ if(b&1) res=res*a%mod; a=a*a%mod; b>>=1; } return res; } int mul(int a,int b){ int ans=0; while (b) { if (b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1; } return ans; } void init(){ nm[0]=inv[0]=1; for(int i=1;i<=1e6;i++){ nm[i]=nm[i-1]*i%mod; inv[i]=kmi(nm[i],mod-2); } } void euler(int n){ judge[1]=1; for(int i=2;i<=n;i++){ if(!judge[i]){ pm.push_back(i); } for(int j=0;pm[j]*i<=n;j++){ judge[pm[j]*i]=1; if(i%pm[j]==0) break; } } } int C(int a,int b){ return nm[a]*inv[a-b]%mod*inv[b]%mod; } //从1开始的异或和, void solve(){ int l,r,x;cin>>l>>r>>x; l=(l+x-1)/x; r=r/x; l--; int prel,prer; if(l%4==0) prel=l; else if(l%4==1) prel=1; else if(l%4==2) prel=l+1; else if(l%4==3) prel=0; if(r%4==0) prer=r; else if(r%4==1) prer=1; else if(r%4==2) prer=r+1; else if(r%4==3) prer=0; cout<<(prer^prel)*x; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); // for(int i=2;i<=1e6;i++){ // Log2[i]=Log2[i/2]+1; // } int T=1;//cin>>T; while(T--) solve(); return 0; }