51nod1227 平均最小公倍数

本文深入探讨了数论在算法竞赛中的应用,详细讲解了求解特定数学问题的高效算法,包括预处理技术、数论函数的计算以及快速求和方法。通过具体的代码实现,展示了如何在大规模数据下进行优化计算。

题目
题解

Code

#include<bits/stdc++.h>
using namespace std;
const int N=4000002,inv2=500000004,inv6=166666668,M=1e9+7;
int a,b,v[255],i,j,cnt,phi[N],pr[N/13],nn,t;
bool vis[N];
int sum(int n){
	if (n<N) return phi[n];
	if (v[nn/n]) return v[nn/n];
	int ans=1ll*n*(n+1)%M*(n*2+1)%M*inv6%M;
	for (int i=2,j;i<=n;i=j+1){
		j=n/(n/i);
		(ans-=1ll*(j-i+1)*(i+j)%M*inv2%M*sum(n/i)%M)%=M;
	}
	return v[nn/n]=ans;
}
int F(int n){
	nn=n,memset(v,0,sizeof(v));
	int ans=0;
	for (int i=1,j;i<=n;i=j+1){
		j=n/(n/i);
		(ans+=1ll*(sum(j)-sum(i-1))*(n/i)%M)%=M;
	}
	return (1ll*(ans+n)*inv2%M+M)%M;
}
int main(){
	scanf("%d%d",&a,&b);
	phi[1]=1;
	for (i=2;i<N;i++){
		if (!vis[i]) pr[cnt++]=i,phi[i]=i-1;
		for (j=0;j<cnt && (t=i*pr[j])<N;j++){
			vis[t]=1;
			if (!(i%pr[j])){
				phi[t]=phi[i]*pr[j];
				break;
			}
			phi[t]=phi[i]*(pr[j]-1);
		}
	}
	for (i=2;i<N;i++) phi[i]=1ll*phi[i]*i%M,(phi[i]+=phi[i-1])%=M;
	printf("%d",(F(b)-F(a-1)+M)%M);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值