求 (n mod 1)⊕(n mod 2)⊕.......⊕(n mod n)

该博客探讨了一道涉及大数模运算的复杂算法问题,使用了分块技术和类欧几里得算法进行优化。通过递归和位操作,博主展示了如何高效地计算(n mod 1) ⊕ (n mod 2) ⊕ ... ⊕ (n mod n),并提供了C++代码实现。
摘要由CSDN通过智能技术生成

题意:求 (n mod 1)⊕(n mod 2)⊕…⊕(n mod n)
数据范围:n≤1e12

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

typedef long long LL;

LL n;

bool f(LL a,LL b,LL c,LL n)
{
	if (!a) return (((n+1)&(b/c))&1)>0;
	if (a>=c || b>=c)
	{
		LL sqr=(n&1) ?(n+1)/2*n :n/2*(n+1) ;
		return ((f(a%c,b%c,c,n)+(a/c)*sqr+(n+1)*(b/c))&1)>0;
	} else
	{
		LL m=(a*n+b)/c;
		return (((m*n)^f(c,c-b-1,a,m-1))&1)>0;
	}
}

int T;
int main()
{
	scanf("%d",&T);
	while (T--)
	{
		scanf("%lld",&n);
		
		LL ans=0,sqrtn=min(30000000ll,n);
		fo(i,1,sqrtn) ans^=n%i;
		for(LL i=sqrtn+1, j; i<=n; i=j+1)
		{
			j=n/(n/i);
			LL lim=n/i*(j-i)+n%j, ans1=0;
			for(LL k=1; k<=lim; k<<=1) ans1+=f(n/i,n%j,k,j-i)*k;
			ans^=ans1;
		}
		
		printf("%lld\n",ans);
	}
}

hdu一道我看不懂的题目(类欧几里得+分块

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值