bzoj 3994 [SDOI2015]约数个数和——反演

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3994

\( d(i*j)=\sum\limits_{x|i}\sum\limits_{y|j}e(gcd(\frac{i}{x},y)==1) \)

即把 i*j 的约数质因数分解后,把质因数尽量放在 x 那里,以防重复。

\( ans = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{x|i}\sum\limits_{y|j}e(gcd(\frac{i}{x},y)==1) \)

  \( = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d|x , d|y}\mu(d) \)

注意这里不要把 d 提前,要把 x , y 提前。

  \( = \sum\limits_{x=1}^{n}\sum\limits_{y=1}^{m}\left\lfloor \frac{n}{x} \right\rfloor \left\lfloor \frac{m}{y} \right\rfloor \sum\limits_{d|x , d|y}\mu(d) \)

  \( = \sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{\frac{n}{d}}\sum\limits_{j=1}^{\frac{m}{d}}\left\lfloor \frac{n}{i*d} \right\rfloor \left\lfloor \frac{m}{j*d} \right\rfloor \)

这时要发现右边的求和边界与值的一些共同点。

  \( = \sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{\frac{n}{d}}\left\lfloor \frac{\left\lfloor\frac{n}{d}\right\rfloor}{i} \right\rfloor\sum\limits_{j=1}^{\frac{m}{d}} \left\lfloor \frac{\left\lfloor\frac{m}{d}\right\rfloor}{j} \right\rfloor \)

令 \( g(i) = \sum\limits_{j=1}^{i}\left\lfloor\frac{i}{j}\right\rfloor \) ,则 g 可以 \( n\sqrt{n} \) 预处理。剩下的就是数论分块了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e4+5;
int u[N],s[N],pri[N];bool vis[N];ll g[N];
void init()
{
  int lm=5e4,cnt=0;
  for(int t=1;t<=lm;t++)
    for(int i=1,j;i<=t;i=j+1)
      {
    int d=t/i; j=t/d;
    g[t]+=(ll)d*(j-i+1);
      }
  u[1]=s[1]=1;
  for(int i=2;i<=lm;i++)
    {
      if(!vis[i])pri[++cnt]=i,u[i]=-1;
      for(int j=1;j<=cnt&&(ll)i*pri[j]<=lm;j++)
    {
      vis[i*pri[j]]=1;
      if(i%pri[j]==0){u[i*pri[j]]=0;break;}
      u[i*pri[j]]=-u[i];
    }
      s[i]=s[i-1]+u[i];
    }
}
int main()
{
  int T,n,m;scanf("%d",&T); init();
  while(T--)
    {
      scanf("%d%d",&n,&m);if(n>m)swap(n,m);
      ll ans=0;
      for(int i=1,j;i<=n;i=j+1)
    {
      int d0=n/i,d1=m/i; j=min(n/d0,m/d1);
      ans+=(ll)(s[j]-s[i-1])*g[d0]*g[d1];
    }
      printf("%lld\n",ans);
    }
  return 0;
}

 

posted on 2018-12-13 10:19  Narh  阅读(105)  评论(0编辑  收藏  举报

导航