内含有 这个约数的数个数为 ,
当 为偶数时, 贡献为 , 当 为奇数时, 对整体答案贡献为 异或,
枚举 直接计算贡献, 复杂度 .
用 整除分块 加上类似 这里 的方法可以优化到 , 但是仍然不能 .
有一个规律, 设 为 内的异或和, 则
于是前面需要 计算的只需要 了, 总体复杂度 , 可以 .
没什么好说的 …
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
ll N;
ll Ans;
ll Sum(ll x){
if(!x) return 0;
ll s_1, s_2;
if(x & 1) s_1 = 0;
else s_1 = x;
ll tmp = (N-1)/x + 1;
if(tmp & 1) s_2 = 1;
else s_2 = 0;
return s_1 + s_2;
}
int main(){
scanf("%lld", &N);
for(reg ll l = 1, r; l <= N; l = r+1){
r = N/(N/l);
if((N/l & 1) == 0) continue ;
Ans ^= Sum(r) ^ Sum(l-1);
}
printf("%lld
", Ans);
return 0;
}