GMOJ 8127. 【2022.10.22联考noip模拟】一切大师

给你 L106x,y100,要求 lcm(a,b)L|axby|

喜闻乐见的推式子:

lcm(a,b)L|axby|=d=1Lda=1Ldb=1Lda[gcd(i,j)=1]|axby|dabgcd=d=1Lda=1Ldb=1Ldau|i,u|jμ(u)|axby|=d=1Ldu=1Ldμ(u)ua=1Ldu2b=1Ldu2a|axby|=T=1Lu2|Tμ(u)uTu2a=1LTb=1LTa|axby|T=du2=T=1L(u2|Tμ(u)Tu)(a=1LTb=1LTa|axby|)

其中,对于每一个 T,前一个括号可以通过一开始从小到大枚举 u 贡献到 T 预处理出来,时间复杂度 u=1LO(ni2)<O(nlnn);后一个括号相当于求 T=1LwTf(LT),其中 f(n)=i=1nj=1ni|ixjy|w 是第一个括号,可以用整除分块做,大概是 O(nlnn),但是跑得很快。

点击开 D
const int N=1e6+99;
ll L,x,y,xi[N]={};
int mu[N]={},su[N]={}; bool flag[N]={};
ll f(int n) {
	int i,j,top; ll ans=0;
	for(i=1;i<=n;++i)
		for(j=1,top=n/i;j<=top;++j)
			ans+=abs(i*x-j*y);
	return ans;
}
int main()
{
	usefile("a");
	ll ans=0,i,j,l,r;
	read(L,x,y);
	flag[1]=true,mu[1]=1;
	for(i=2;i<=L;++i) {
		if(!flag[i]) su[++su[0]]=i,mu[i]=-1;
		for(j=1;j<=su[0]&&i*su[j]<=L;++j) {
			flag[i*su[j]]=true;
			if(i%su[j]==0) {
				mu[i*su[j]]=0; break;
			} else mu[i*su[j]]=-mu[i];
		}
	}
	for(i=1;i<=L;++i)
		if(mu[i])
			for(j=i*i;j<=L;j+=i*i)
				xi[j]+=mu[i]*j/i;
	for(i=1;i<=L;++i) xi[i]+=xi[i-1];
	for(l=1;l<=L;l=r+1)
		r=L/(L/l),ans+=(xi[r]-xi[l-1])*f(L/l);
	printf("%lld\n",ans);
	return 0;
}
posted @   fydj  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示