POJ 3495 Bitwise XOR of Arithmetic Progression 数论

题目大意:给定 x,y,z ,求 x(x+z)(x+2z)...(x+kz) ,其中 yz<x+kzy

困扰了我多年的心腹大患终于干掉了。。。

由于异或操作中每一位彼此独立,我们可以一位一位做
对于第 i 位,这一位的值为 (x2i+x+z2i+x+2z2i+...+x+kz2i) mod 2
问题转化成了求 n1i=0ax+bc

n1i=0ax+bc
=nbc+n(n1)2ac+n1i=0(a%c)x+(b%c)c
然后观察后面那个 n1i=0(a%c)x+(b%c)c ,我们把坐标系转一下
POJ 3495 Bitwise XOR of Arithmetic Progression 数论_第1张图片
就变成了 (a%c)n+(b%c)c1i=0cx+(an+b)%ca%c
自行推导有益于身体健康,加油

观察式子发现 a c 在辗转相除。。。于是就是 O(logn)
总时间复杂度 O(log2n)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long x,y,z;
long long Calculate(long long a,long long b,long long c,long long n)
{
    if(n==0) return 0;
    return (b/c)*n+(a/c)*n*(n-1)/2+Calculate(c,(a*n+b)%c,a%c,(a%c*n+b%c)/c);
}
int main()
{
    int i;
    while(cin>>x>>y>>z)
    {
        long long ans=0;
        for(i=0;i<32;i++)
            ans|=(Calculate(z,x,1ll<<i,(y-x)/z+1)&1ll)<<i;
        cout<<ans<<endl;
    }
    return 0;
}

你可能感兴趣的:(数论,poj,POJ3495)