【JZOJ4872】太阳神(莫比乌斯反演)(数论分块)

题意:

给定一个 n n n,求有多少对 ( a , b ) (a,b) (a,b)满足 a ≤ n , b ≤ n , l c m ( a , b ) > n a≤n,b≤n,lcm(a,b)>n an,bn,lcm(a,b)>n n ≤ 1 e 10 n\leq 1e10 n1e10


题解:

首先转化一下,计算 a ≤ n , b ≤ n , l c m ( a , b ) ≤ n a\leq n,b\leq n,lcm(a,b)\leq n an,bn,lcm(a,b)n的对数。

A n s = ∑ a = 1 n ∑ b = 1 n [ l c m ( a , b ) ≤ n ] = ∑ a = 1 ∑ b = 1 [ a ⋅ b g c d ( a , b ) ≤ n ] = ∑ d = 1 ∑ a = 1 ∑ b = 1 [ g c d ( a , b ) = d ] [ a ⋅ b d ≤ n ] = ∑ d = 1 ∑ a = 1 ∑ b = 1 [ g c d ( a , b ) = 1 ] [ a b d ≤ n ] = ∑ k = 1 μ ( k ) ∑ d = 1 ∑ a = 1 ∑ b = 1 [ a b d ≤ n k 2 ] \begin{aligned} Ans=&\sum_{a=1}^n\sum_{b=1}^n[lcm(a,b)\leq n]\\ =&\sum_{a=1}\sum_{b=1}[\frac{a\cdot b}{gcd(a,b)}\leq n]\\ =&\sum_{d=1}\sum_{a=1}\sum_{b=1}[gcd(a,b)=d][\frac{a\cdot b}{d}\leq n]\\ =&\sum_{d=1}\sum_{a=1}\sum_{b=1}[gcd(a,b)=1][abd\leq n]\\ =&\sum_{k=1}\mu(k)\sum_{d=1}\sum_{a=1}\sum_{b=1}[abd\leq \frac{n}{k^2}] \end{aligned} Ans=====a=1nb=1n[lcm(a,b)n]a=1b=1[gcd(a,b)abn]d=1a=1b=1[gcd(a,b)=d][dabn]d=1a=1b=1[gcd(a,b)=1][abdn]k=1μ(k)d=1a=1b=1[abdk2n]

所以我们需要计算的就是 a b c ≤ m abc\leq m abcm的有序三元组 ( a , b , c ) (a,b,c) (a,b,c)个数。

a &lt; b &lt; c a&lt;b&lt;c a<b<c,相等的情况可以特殊处理。枚举 a ∈ [ 1 , m 3 ] , b ∈ [ a + 1 , n / a ] a\in [1,\sqrt[3]{m}],b\in [a+1,\sqrt{n/a}] a[1,3m ],b[a+1,n/a ] c c c可以直接统计。

复杂度可以通过积分来估计。

对于 m m m进行一次这样的计算的复杂度为:

T ( m ) = ∫ 1 m 3 m x d x = m ⋅ ∫ 1 m 3 x − 1 2 d x = m 1 2 ⋅ O ( m 1 6 − o ( 1 ) ) = O ( m 2 3 ) \begin{aligned} T(m)=&amp;\int_{1}^{\sqrt[3]{m}}\sqrt{\frac{m}{x}}dx\\ =&amp;\sqrt m\cdot \int_{1}^{\sqrt[3]m}x^{-\frac{1}{2}}dx\\ =&amp;m^{\frac{1}{2}}\cdot O(m^\frac{1}{6}-o(1))\\ =&amp;O(m^{\frac{2}{3}}) \end{aligned} T(m)====13m xm dxm 13m x21dxm21O(m61o(1))O(m32)

那么总复杂度为:

Q ( n ) = ∫ 1 n ( n x 2 ) 2 3 d x = n 2 3 ∫ 1 n x − 4 3 d x = n 2 3 ⋅ O ( n − 1 6 + o ( 1 ) ) = O ( n 2 3 ) \begin{aligned} Q(n)=&amp;\int_{1}^{\sqrt n}(\frac{n}{x^2})^{\frac{2}{3}}dx\\ =&amp;n^{\frac{2}{3}}\int_{1}^{\sqrt n}x^{-\frac{4}{3}}dx\\ =&amp;n^\frac{2}{3}\cdot O(n^{-\frac{1}6}+o(1))\\ =&amp;O(n^{\frac{2}{3}}) \end{aligned} Q(n)====1n (x2n)32dxn321n x34dxn32O(n61+o(1))O(n32)


代码:

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const

using std::cerr;
using std::cout;

cs int mod=1e9+7;

cs int N=1e5+7;
int p[N],pc;
bool mark[N];
int mu[N];

inline void linear_sieves(int lim){
	mu[1]=1;
	for(int re i=2;i<=lim;++i){
		if(!mark[i])p[++pc]=i,mu[i]=-1;
		for(int re j=1;i*p[j]<=lim;++j){
			mark[i*p[j]]=true;
			if(i%p[j])mu[i*p[j]]=-mu[i];
			else break;
		}
	}
} 

ll last,res;

inline ll solve(ll n){
	if(n==last)return res;last=n,res=0;
	for(int a=1;(ll)a*a*a<=n;++a){
		res+=3ll*(n/a/a-a)+1,res%=mod;
		for(int re b=a+1,lb=sqrt(n/a);b<=lb;++b)
		res+=6ll*(n/a/b-b)+3,res%=mod;
	}
	return res;
}

signed main(){
#ifdef zxyoi
	freopen("sun.in","r",stdin);
#endif
	ll n;scanf("%lld",&n);
	int lim=sqrt(n);linear_sieves(lim);
	ll ans=0;last=-1;
	for(int re i=1;i<=lim;++i)if(mu[i])ans+=mu[i]*solve(n/i/i),ans%=mod;
	n%=mod;
	ans=((n*n-ans)%mod+mod)%mod;
	cout<<ans<<"\n";
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值