Luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB 【莫比乌斯反演】【线性筛】

前前言

2021.11.09
过了好久又跑过来补坑了,难受~~~

前言

每日水博客,学了莫比乌斯感觉就像打开了新世界的大门一样,看啥都想反演一下。
这不?又来一道省选题切一切~~~~

题意一看就懂,就是求lcm();
用莫比乌斯反演变一下型,其中的基本操作看另一篇

Ans=i=1nj=1mlcm(i,j)=i=1nj=1mi×jgcd(i,j)d=gcd(i,j)Ans=d=1ni=1n/dj=1m/di×j×ϵ[gcd(i,j)=1]sum(n,m)=i=1nj=1mi×j×ϵ[gcd(i,j)=1]=i=1nj=1ml|i,l|jμ(l)×I(l)=l=1n×μ(l)×l2i=1n/lj=1m/li×jg(n,m)=i=1nij=1mj=(n+1)×nn×(m+1)×mm

具体实现就是,开始线性筛,然后定义三个函数,最后运用整除分块优化。

点击查看代码
#include<bits/stdc++.h>
using std::min;

const int N=1e7;
const int mod=20101009;
int n,m,mu[N+5],p[N/10+5],sum[N+5];
bool flg[N+5];

void init(){
	mu[1]=1;
	int cnt=0,k=min(n,m);
	for(int i=2;i<=k;i++){
		if(!flg[i]){
			mu[i]=-1;
			p[++cnt]=i;
		}
		for(int j=1;j<=cnt;j++){
			if(i*p[j]>k){
				break;
			}
			flg[i*p[j]]=1;
			if(i%p[j]==0) {
				mu[i*p[j]]=0;
				break;
			}
			mu[i*p[j]]=-mu[i];
		}
	}
	for(int i=1;i<=k;i++){
		sum[i]=(sum[i-1]+1ll*i*i%mod*(mu[i]+mod))%mod;
	}
	return ;
}

int Sum(int x,int y){
	return (1ll*x*(x+1)/2%mod)*(1ll*y*(y+1)/2%mod)%mod;
}

int fanc(int x,int y){
	int res=0;
	for(int i=1,j;i<=min(x,y);i=j+1){
		j=min(x/(x/i),y/(y/i));
		res=(res+1ll*(sum[j]-sum[i-1]+mod)*(Sum(x/i,y/i)%mod))%mod;
	}
	return res;
}

int solve(int x,int y){
	int res=0;
	for(int i=1,j;i<=min(x,y);i=j+1){
		j=min(x/(x/i),y/(y/i));
		res=(res+1ll*(j-i+1)*(i+j)/2%mod*fanc(x/i,y/i)%mod)%mod;
	}
	return res;
}
int main()
{
	std::cin>>n>>m;
	init();
	std::cout<<solve(n,m)<<std::endl;
	
	
	return 0;
}
posted @   SSZX_loser_lcy  阅读(44)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示