hdu6588(莫比乌斯反演)

题目:求 ∑ i = 1 n g c d ( i 3 , i ) , n ≤ 1 e 21 \sum\limits_{i=1}^{n} gcd(\sqrt[3]{i},i),n\leq1e^{21} i=1ngcd(3i ,i),n1e21
本文学习了连接这位大佬的博客,本文仅仅是理解他博客的公式后自己的推公式过程
直接求显然不可以,推一波公式化简一下。
前置公式:
(1)莫比乌斯公式:若 g ( x ) = ∑ x ∣ d f ( d ) g(x)=\sum\limits_{x|d}f(d) g(x)=xdf(d),则 f ( x ) = ∑ x ∣ d μ ( d x ) g ( d ) f(x)=\sum\limits_{x|d} \mu(\frac{d}{x})g(d) f(x)=xdμ(xd)g(d)
(2)欧拉函数与莫比乌斯函数的一个关系式: ϕ ( n ) = \phi(n)= ϕ(n)= ∑ d ∣ n μ ( d ) ⋅ ⌊ n d ⌋ \sum\limits_{d|n}μ(d)\cdot⌊\frac{n}{d}⌋ dnμ(d)dn ;
(3) ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum\limits_{i=1}^{n}i^2=\frac{n(n+1)(2n+1)}{6} i=1ni2=6n(n+1)(2n+1)
(4) ∑ i = 1 n i = n ( n + 1 ) 2 \sum\limits_{i=1}^{n}i=\frac{n(n+1)}{2} i=1ni=2n(n+1)
(5) 若 a ∣ b , b ∣ c , 则 a ∣ c 若a|b,b|c,则a|c abbcac
正式推公式:
∑ i = 1 n g c d ( i 3 , i ) \sum\limits_{i=1}^{n}gcd(\sqrt[3]{i},i) i=1ngcd(3i ,i)
= ∑ i = ⌊ n 3 ⌋ 3 n g c d ( ⌊ n 3 ⌋ , i ) + ∑ a = 1 ⌊ n 3 ⌋ − 1 ∑ i = a 3 ( a + 1 ) 3 − 1 g c d ( a , i ) =\sum\limits_{i=⌊\sqrt[3]{n}⌋^3}^{n}gcd(⌊\sqrt[3]{n}⌋,i)+\sum\limits_{a=1}^{⌊\sqrt[3]{n}⌋-1}\sum\limits_{i=a^3}^{(a+1)^3-1}gcd(a,i) =i=3n 3ngcd(3n ,i)+a=13n 1i=a3(a+1)31gcd(a,i)
我们看到求解的问题被分为两部分,但前后两部分都有求 ∑ i = l r g c d ( a , i ) \sum\limits_{i=l}^{r}gcd(a,i) i=lrgcd(a,i)把这部分单独拿出来求

定义 f ( l , r , x ) = ∑ i = l r [ g c d ( i , a ) = = x ] f(l,r,x)=\sum\limits_{i=l}^{r}[gcd(i,a)==x] f(l,r,x)=i=lr[gcd(i,a)==x]
∑ i = l r g c d ( a , i ) = ∑ x ∣ a x ∑ i = l r [ g c d ( i , a ) = = x ] = ∑ x ∣ a x f ( l , r , x ) \sum\limits_{i=l}^{r}gcd(a,i)=\sum\limits_{x|a}x\sum\limits_{i=l}^{r}[gcd(i,a)==x]=\sum\limits_{x|a}xf(l,r,x) i=lrgcd(a,i)=xaxi=lr[gcd(i,a)==x]=xaxf(l,r,x)
f f f进行反演一波,构造 g ( l , r , x ) = ∑ x ∣ d f ( l , r , d ) = ∑ x ∣ d f ( l , r , d ) = ∑ x ∣ d ∑ i = l r [ g c d ( i , a ) = = d ] g(l,r,x)=\sum\limits_{x|d}f(l,r,d)=\sum\limits_{x|d}f(l,r,d)=\sum\limits_{x|d}\sum\limits_{i=l}^{r}[gcd(i,a)==d] g(l,r,x)=xdf(l,r,d)=xdf(l,r,d)=xdi=lr[gcd(i,a)==d]
由公式(5)可知 i i i只要满足 x ∣ g c d ( i , a ) x|gcd(i,a) xgcd(i,a)即为有效贡献,所以 g ( l , r , x ) = ∑ i = l r [ x ∣ g c d ( i , a ) ] = ⌊ r x ⌋ − ⌊ l − 1 x ⌋ g(l,r,x)=\sum\limits_{i=l}^{r}[x|gcd(i,a)]=⌊\frac{r}{x}⌋-⌊\frac{l-1}{x}⌋ g(l,r,x)=i=lr[xgcd(i,a)]=xrxl1,注意这里要满足 x ∣ a x|a xa
因为如果 x 不 是 a 的 因 子 的 话 , g ( l , r , x ) = 0 x不是a的因子的话,g(l,r,x)=0 xag(l,r,x)=0
由公式(1)可知 f ( l , r , x ) = ∑ x ∣ d μ ( d x ) g ( l , r , d ) f(l,r,x)=\sum\limits_{x|d}\mu(\frac{d}{x})g(l,r,d) f(l,r,x)=xdμ(xd)g(l,r,d)
因为如果 x 不 是 a 的 因 子 的 话 , g ( l , r , x ) = 0 x不是a的因子的话,g(l,r,x)=0 xag(l,r,x)=0
所以 f ( l , r , x ) = = ∑ x ∣ d , d ∣ a μ ( d x ) ( ⌊ r d ⌋ − ⌊ l − 1 d ⌋ ) f(l,r,x)==\sum\limits_{x|d,d|a}\mu(\frac{d}{x})(⌊\frac{r}{d}⌋-⌊\frac{l-1}{d}⌋) f(l,r,x)==xd,daμ(xd)(drdl1)
所以 ∑ i = l r g c d ( a , i ) = ∑ x ∣ a x ∑ x ∣ d , d ∣ a μ ( d x ) ( ⌊ r d ⌋ − ⌊ l − 1 d ⌋ ) = ∑ d ∣ a ( ⌊ r d ⌋ − ⌊ l − 1 d ⌋ ) ∑ x ∣ d x μ ( d x ) = ∑ d ∣ a ( ⌊ r d ⌋ − ⌊ l − 1 d ⌋ ) ϕ ( d ) \sum\limits_{i=l}^{r}gcd(a,i)=\sum\limits_{x|a}x\sum\limits_{x|d,d|a}\mu(\frac{d}{x})(⌊\frac{r}{d}⌋-⌊\frac{l-1}{d}⌋)=\sum\limits_{d|a}(⌊\frac{r}{d}⌋-⌊\frac{l-1}{d}⌋)\sum\limits_{x|d}x\mu(\frac{d}{x})=\sum\limits_{d|a}(⌊\frac{r}{d}⌋-⌊\frac{l-1}{d}⌋)\phi(d) i=lrgcd(a,i)=xaxxd,daμ(xd)(drdl1)=da(drdl1)xdxμ(xd)=da(drdl1)ϕ(d)

最后一步就是把 x 和 d 的 顺 序 调 换 , 本 来 是 先 x ∣ a 再 x ∣ d , d ∣ a x和d的顺序调换,本来是先x|a再x|d,d|a xdxaxd,da转成先 d ∣ a , 再 x ∣ d d|a,再x|d da,xd

到这里就可以 O ( a ) 求 ∑ i = l r g c d ( a , i ) O(\sqrt{a})求\sum\limits_{i=l}^{r}gcd(a,i) Oa i=lrgcd(a,i)了,所以求解 ∑ i = ⌊ n 3 ⌋ 3 n g c d ( ⌊ n 3 ⌋ , i ) \sum\limits_{i=⌊\sqrt[3]{n}⌋^3}^{n}gcd(⌊\sqrt[3]{n}⌋,i) i=3n 3ngcd(3n ,i)的复杂度为 O ( n 6 ) O(\sqrt[6]{n}) O(6n )
对于后一段,直接求复杂度仍然很高,需要继续化简 ∑ a = 1 ⌊ n 3 ⌋ − 1 ∑ i = a 3 ( a + 1 ) 3 − 1 g c d ( a , i ) = ∑ a = 1 ⌊ n 3 ⌋ − 1 ∑ d ∣ a ( ⌊ ( a + 1 ) 3 d ⌋ − ⌊ a 3 − 1 d ⌋ ) ϕ ( d ) = ∑ d = 1 ⌊ n 3 ⌋ − 1 ϕ ( d ) ∑ i = 1 ⌊ ⌊ n 3 ⌋ − 1 d ⌋ ⌊ ( d i + 1 ) 3 d ⌋ − ⌊ d i 3 − 1 d ⌋ ) = ∑ d = 1 ⌊ n 3 ⌋ − 1 ∑ i = 1 ⌊ ⌊ n 3 ⌋ − 1 d ⌋ ( 3 i 2 d + 3 i + 1 ) ϕ ( d ) \sum\limits_{a=1}^{⌊\sqrt[3]{n}⌋-1}\sum\limits_{i=a^3}^{(a+1)^3-1}gcd(a,i)=\sum\limits_{a=1}^{⌊\sqrt[3]{n}⌋-1}\sum\limits_{d|a}(⌊\frac{(a+1)^3}{d}⌋-⌊\frac{a^3-1}{d}⌋)\phi(d)=\sum\limits_{d=1}^{⌊\sqrt[3]{n}⌋-1}\phi(d)\sum\limits_{i=1}^{⌊\frac{⌊\sqrt[3]{n}⌋-1}{d}⌋}⌊\frac{(di+1)^3}{d}⌋-⌊\frac{di^3-1}{d}⌋)= \sum\limits_{d=1}^{⌊\sqrt[3]{n}⌋-1}\sum\limits_{i=1}^{⌊\frac{⌊\sqrt[3]{n}⌋-1}{d}⌋}(3i^2d+3i+1)\phi(d) a=13n 1i=a3(a+1)31gcd(a,i)=a=13n 1da(d(a+1)3da31)ϕ(d)=d=13n 1ϕ(d)i=1d3n 1d(di+1)3ddi31)=d=13n 1i=1d3n 1(3i2d+3i+1)ϕ(d)
y = ⌊ ⌊ n 3 ⌋ − 1 d ⌋ y=⌊\frac{⌊\sqrt[3]{n}⌋-1}{d}⌋ y=d3n 1且又(4)(5)得后半段为
∑ a = 1 ⌊ n 3 ⌋ − 1 ∑ i = a 3 ( a + 1 ) 3 − 1 g c d ( a , i ) = ∑ d = 1 ⌊ n 3 ⌋ − 1 ϕ ( a ) ( 3 ∗ d ∗ y ( y + 1 ) ( 2 y + 1 ) 6 + 3 y ( y + 1 ) 2 + y ) \sum\limits_{a=1}^{⌊\sqrt[3]{n}⌋-1}\sum\limits_{i=a^3}^{(a+1)^3-1}gcd(a,i)=\sum\limits_{d=1}^{⌊\sqrt[3]{n}⌋-1}\phi(a)(3*d*\frac{y(y+1)(2y+1)}{6}+3\frac{y(y+1)}{2}+y) a=13n 1i=a3(a+1)31gcd(a,i)=d=13n 1ϕ(a)(3d6y(y+1)(2y+1)+32y(y+1)+y)
y y y进行分块处理,整体复杂度也为O( n 6 \sqrt[6]{n} 6n ),对 ϕ ( i ) 和 i ϕ ( i ) 前 缀 和 预 处 理 为 O ( n 3 ) \phi(i)和i\phi(i)前缀和预处理为O(\sqrt[3]{n}) ϕ(i)iϕ(i)O(3n )
所以这道题可以在复杂度 O ( n 3 ) O(\sqrt[3]{n}) O(3n )下完成。
代码因为找不到错误,对拍对着对着跟原博主的代码越来越像。
ac代码:

#include<bits/stdc++.h>
#define db double
#define ui unsigned int
#define ll long long
#define ull unsiged ll
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l)for(int i=r;i>=l;i--)
#define file(x) freopen(#x".in","w",stdout);
#define bug(x) cerr<<#x<<": "<<x<<endl
typedef __int128 int128;
using namespace std;
const int MX = 1e7 + 7;
const int mod=998244353;
ll modulo(ll num, ll MOD = mod) { return ((num%MOD) + MOD) % MOD; }
ll power(ll b, ll e, ll MOD = mod) { ll ans = 1; while (e) { if (e % 2) ans = (ans*b) % MOD; b = (b*b) % MOD; e /= 2; } return ans; }
ll inv(ll num, ll MOD = mod) { return power(modulo(num), MOD - 2, MOD); }
ll gcd(ll a, ll b) { return ((b == 0) ? a : gcd(b, a%b)); }
ll phi[MX];
ll pri[MX],inv2,inv6,iphi[MX],phisum[MX];
bool isp[MX];
int tmp=0;
struct Istream {
    template <class T>
    Istream &operator >>(T &x) {
        static char ch;static bool neg;
        for(ch=neg=0;ch<'0' || '9'<ch;neg|=ch=='-',ch=getchar());
        for(x=0;'0'<=ch && ch<='9';(x*=10)+=ch-'0',ch=getchar());
        x=neg?-x:x;
        return *this;
    }
}fin;
struct Ostream {
    template <class T>
    Ostream &operator <<(T x) {
        x<0 && (putchar('-'),x=-x);
        static char stack[233];static int top;
        for(top=0;x;stack[++top]=x%10+'0',x/=10);
        for(top==0 && (stack[top=1]='0');top;putchar(stack[top--]));
        return *this;
    }
    Ostream &operator <<(char ch) {
        putchar(ch);
        return *this;
    }
}fout;
void pre_phi()
{
  isp[0]=isp[1]=false;
  phi[1]=1;
  for(int i=2;i<MX;i++)
  {
    if(!isp[i])
    {
      pri[++tmp]=i;
      phi[i]=i-1;
    }
    for(ll j=1;i*pri[j]<MX&&j<=tmp;j++)
    {
      int ans=i*pri[j];
      isp[ans]=true;
      if(i%pri[j])
      {
        phi[ans]=phi[i]*(pri[j]-1);
      }
      else {
        phi[ans]=phi[i]*pri[j];
        break;
      }
    }
  }
  phisum[1]=1,iphi[1]=1;
  for(int i=2;i<MX;i++)
  {
    iphi[i]=(iphi[i-1]+1ll*i*phi[i]%mod)%mod;
    phisum[i]=(phisum[i-1]+phi[i])%mod;
  }
}
int128 get_n3(int128 n)
{
  int128  l=0,r=1e8,res=1,mid;
  while(l<=r)
  {
      mid=(l+r)/2;
    if(int128(mid*mid*mid)<=n)res=mid,l=mid+1;
    else r=mid-1;
  }
  return res;
}
int main()
{
	inv2=inv(2),inv6=inv(6);
	int t;
	pre_phi();
	fin>>t;
	while(t--){
	int128 n;
	fin>>n;
	ll ans=0;
	int128 n3=get_n3(n);
	int128 m=n3*n3*n3;
	for(ll i=1;i*i<=n3;i++)
  {
    if(n3%i==0)
    {
      ans=ans+phi[i]*(n/i-(m-1)/i)%mod;
      ll t=n3/i;
      if(i*i!=n3)
        ans+=phi[t]*(n/t-(m-1)/t)%mod;
      ans=ans%mod;
    }
  }
  n3--;
  ll j,res;
  for(ll i=1;i<=n3;i=j+1)
  {
    res=n3/i;
    j=n3/res;
    ans=ans+3*(iphi[j]-iphi[i-1]+mod)%mod*res%mod*(res+1)%mod*(2*res+1)%mod*inv6%mod;
    ans=ans+(phisum[j]-phisum[i-1]+mod)%mod*(3*res*(res+1)%mod*inv2%mod+res)%mod;
    ans=ans%mod;
  }
  fout<<ans<<'\n';
  //cout<<ans<<endl;
  }
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值