题意:
给定一个 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 a≤n,b≤n,lcm(a,b)>n, n ≤ 1 e 10 n\leq 1e10 n≤1e10
题解:
首先转化一下,计算 a ≤ n , b ≤ n , l c m ( a , b ) ≤ n a\leq n,b\leq n,lcm(a,b)\leq n a≤n,b≤n,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=1∑nb=1∑n[lcm(a,b)≤n]a=1∑b=1∑[gcd(a,b)a⋅b≤n]d=1∑a=1∑b=1∑[gcd(a,b)=d][da⋅b≤n]d=1∑a=1∑b=1∑[gcd(a,b)=1][abd≤n]k=1∑μ(k)d=1∑a=1∑b=1∑[abd≤k2n]
所以我们需要计算的就是 a b c ≤ m abc\leq m abc≤m的有序三元组 ( a , b , c ) (a,b,c) (a,b,c)个数。
令 a < b < c a<b<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)=&\int_{1}^{\sqrt[3]{m}}\sqrt{\frac{m}{x}}dx\\ =&\sqrt m\cdot \int_{1}^{\sqrt[3]m}x^{-\frac{1}{2}}dx\\ =&m^{\frac{1}{2}}\cdot O(m^\frac{1}{6}-o(1))\\ =&O(m^{\frac{2}{3}}) \end{aligned} T(m)====∫13mxmdxm⋅∫13mx−21dxm21⋅O(m61−o(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)=&\int_{1}^{\sqrt n}(\frac{n}{x^2})^{\frac{2}{3}}dx\\ =&n^{\frac{2}{3}}\int_{1}^{\sqrt n}x^{-\frac{4}{3}}dx\\ =&n^\frac{2}{3}\cdot O(n^{-\frac{1}6}+o(1))\\ =&O(n^{\frac{2}{3}}) \end{aligned} Q(n)====∫1n(x2n)32dxn32∫1nx−34dxn32⋅O(n−61+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;
}