[NOI2010]能量采集[容斥,莫比乌斯反演]

题意

计算\sum (2*i-1)f[i],f[i]表示在1 \leq x \leq N, 1\leq y \leq M范围内gcd(x,y)=i的个数

数据范围:N,M\leq 10^5

题解

这里介绍容斥和莫比乌斯反演两种方法(如果想系统了解这种题目的各种大体思路可以看两两gcd求和的4种方法)
下面先设F[x],f[x]分别为gcd(i,j)(1 \leq i \leq N,1 \leq j \leq M)x​​​​​​倍数和等于x的个数,有F[n]=\sum_{n|d}f[d]=\lfloor \frac{N}{n} \rfloor\lfloor \frac{M}{n} \rfloor

 

容斥(dp筛法)

容斥是利用F[n]=\sum_{n|d}f[d]=\lfloor \frac{N}{n} \rfloor\lfloor \frac{M}{n} \rfloor先计算到每个F[i],再通过从后向前处理得到每个f[i]最后针对问题选取需要的求解

  for(i = 1; i <= top; i++) F[i] = (LL)(N / i) * (M / i);
  for(i = top; i >= 1; i--){
    f[i] = F[i];
    for(j = i * 2; j <= top; j += i)
      f[i] -= f[j];
  }

 

莫比乌斯反演

由莫比乌斯反演知:f[n]=\sum_{n|d}\mu (\frac{d}{n})F[d]

问题的ans=\sum (2*i-1) \sum_{i|d}\mu (\frac{d}{i})[\frac{N}{d}][\frac{M}{d}] =\sum (2*i-1) \sum_{j=1}^{min([\frac{N}{i}],[\frac{M}{i}])}\mu (j)[\frac{N}{ij}][\frac{M}{ij}]

这里如果是单次询问可以不进一步化解直接求和,时间复杂度为O(N)

  for(i = 1; i <= top; i++) pre[i] = pre[i - 1] + mu[i];
  for(i = 1; i <= top; i++) sum[i] = sum[i - 1] + (2 * i - 1);
  int l, r; LL ans = 0;
  for(l = 1; l <= top; l = r + 1){
    r = min(N / (N / l), M / (M / l));
    ans += (LL)solve(N / l, M / l) * (sum[r] - sum[l - 1]);
  }

 

若进一步化解

\\ ans=\sum_{i=1}^{min(N,M)}\sum_{j=1}^{min([\frac{N}{i}],[\frac{M}{i}])} (2i-1)\mu (j) [\frac{N}{ij}][\frac{M}{ij}]\\ =\sum_{k=1}^{min(N,M)} [\frac{N}{k}][\frac{M}{k}] \sum_{i|k} (2i-1)\mu (\frac{k}{i})

这种化解一般都额外需要一个O(NlogN)的前缀和(不化解为O(N)),而每次计算只需要O(\sqrt N),一般针对多次询问

  for(i = 1; i <= top; i++)
    for(j = i; j <= top; j += i)
      sum[j] += mu[j / i] * (2 * i - 1);
  for(i = 1; i <= top; i++) sum[i] += sum[i - 1];
  int l, r; LL ans = 0;
  for(l = 1; l <= top; l = r + 1){
    r = min(N / (N / l), M / (M / l));
    ans += (LL)(N / l) * (M / l) * (sum[r] - sum[l - 1]);
  }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值