Bitwise XOR of Arithmetic Progression
Time Limit: 5000MS | | Memory Limit: 131072K |
Total Submissions: 777 | | Accepted: 178 |
Description
Write a program that, given three positive integers x, y and z (x, y, z < 232, x ≤ y), computes the bitwise exclusive disjunction (XOR) of the arithmetic progression x, x + z, x + 2z, …, x + kz, where k is the largest integer such that x +kz ≤ y.
Input
The input contains multiple test cases. Each test case consists of three integers x, y, z separated by single spaces on a separate line. There are neither leading or trailing blanks nor empty lines. The input ends once EOF is met.
Output
For each test case, output the value of on a separate line. There should be neither leading or trailing spaces nor empty lines.
Sample Input
2 173 11
Sample Output
48
Source
POJ Founder Monthly Contest – 2008.01.31, frkstyc
【代码】
//poj 3495 Bitwise XOR of Arithmetic Progression
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(ll i=j;i<=k;i++)
using namespace std;
ll x,y,z;
inline ll solve(ll a,ll b,ll c,ll n)
{
if(!n) return 0;
ll ans=0;
ans+=b/c*n;
ans+=a/c*n*(n-1)/2;
return ans+solve(c,(a*n+b)%c,a%c,((a%c)*n+b%c)/c);
}
int main()
{
while(scanf("%lld%lld%lld",&x,&y,&z)!=EOF)
{
ll ans=0;
fo(i,0,31)
ans|=((solve(z,x,(ll)1<<i,(y-x)/z+1)&(ll)1)<<i);
printf("%lld\n",ans);
}
return 0;
}