题意:求

$$\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|(i, j)} d 且 (\sum_{d|(i, j)} d)<=a$$

n, m<=1e5,q次询问,q<=2*1e4

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5+10, MN=1e5, YU=(1u<<31)-1;
  4. int c[N], mx;
  5. void upd(int x, int s) { for(; x<=mx; x+=x&-x) c[x]+=s; }
  6. int sum(int x) { int r=0; for(; x; x-=x&-x) r+=c[x]; return r; }
  7.  
  8. bool np[N];
  9. int p[N], pcnt, mu[N], f[N], last[N];
  10. void init() {
  11. mu[1]=f[1]=1;
  12. int i, j;
  13. for(i=2; i<=MN; ++i) {
  14. if(!np[i]) p[++pcnt]=i, mu[i]=-1, f[i]=1+i, last[i]=1;
  15. for(j=1; j<=pcnt; ++j) {
  16. int t=p[j]*i; if(t>MN) break;
  17. np[t]=1;
  18. if(i%p[j]==0) { mu[t]=0; f[t]=last[i]+p[j]*f[i]; last[t]=last[i]; break; }
  19. mu[t]=-mu[i]; f[t]=f[i]*(1+p[j]);
  20. last[t]=f[i];
  21. }
  22. }
  23. }
  24. void update(int d, int s) {
  25. for(int i=d, j=1; i<=mx; i+=d, ++j) upd(i, s*mu[j]);
  26. }
  27.  
  28. struct A { int n, m, a, id; }q[N];
  29. struct B { int f, id; }F[N];
  30. inline bool cmp1(const A &a, const A &b) { return a.a<b.a; }
  31. inline bool cmp2(const B &a, const B &b) { return a.f<b.f; }
  32.  
  33. int Ans[N];
  34. int main() {
  35. init();
  36. int Q; scanf("%d", &Q);
  37. for(int i=1; i<=Q; ++i) scanf("%d %d %d", &q[i].n, &q[i].m, &q[i].a), q[i].id=i, mx=max(mx, max(q[i].n, q[i].m));
  38. sort(q+1, q+1+Q, cmp1);
  39. for(int i=1; i<=mx; ++i) F[i].id=i, F[i].f=f[i];
  40. sort(F+1, F+1+mx, cmp2);
  41.  
  42. int n, m, a, now=1, pos, ans;
  43. for(int k=1; k<=Q; ++k) {
  44. n=q[k].n, m=q[k].m, a=q[k].a; if(n>m) swap(n, m);
  45. while(now<=mx && F[now].f<=a) update(F[now].id, F[now].f), ++now;
  46. pos=ans=0;
  47. for(int i=1; i<=n; i=pos+1) {
  48. pos=min(n/(n/i), m/(m/i));
  49. ans+=(sum(pos)-sum(i-1))*(n/i)*(m/i);
  50. }
  51. Ans[q[k].id]=ans&YU;
  52. }
  53. for(int i=1; i<=Q; ++i) printf("%d\n", Ans[i]);
  54. return 0;
  55. }

  

题解:

终于会了反演= = 其实不就是一个公式吗= =....我们来膜拜PoPoQQQ (http://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html

手推了半小时啊= =在推$f(i)$的时候竟然还不知道有约数和的公式这个玩意QAQ,感谢PoPoQQQ对我的教导,然后我根据这个玩意直接线性筛和mu一起预处理出来了...

首先我们变化一下公式,且先不考虑$<=a$这个条件,且下边均默认$n<=m$:

$$g(d) = \sum_{i=1}^{n} \sum_{j=1}^{m} [(i, j)=d]$$

$$f(d) = \sum_{i|d} i$$

那么本题可以变为枚举$gcd$,求

$$\sum_{i=1}^{n} g(i)f(i)$$

我们先来求$g(d)$(原来的博文是直接展开求的,现在我们用莫比乌斯反演来做...)

$$F(d)表示d|(i, j)的对数,而g(d)是表示(i, j)=d的对数$$

易得

$$ F(d)=
\begin{cases}
\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor \\
\sum_{d|i} g(i) \\
\end{cases}
$$

根据莫比乌斯反演(两种形式,约数和 与 倍数和,这里是倍数和的形式,证明略),易得

$$ g(d) = \sum_{d|i} \mu (\frac{i}{d}) F(i) $$

$f(i)$的求法待会再说。那么现在我们展开之前得到的式子

$$\sum_{i=1}^{n} g(i)f(i) = \sum_{i=1}^{n} f(i) \sum_{i|T} \mu (\frac{T}{i}) F(T) = \sum_{i=1}^{n} f(i) \sum_{i|T} \mu (\frac{T}{i}) \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor $$

继续换指标,我们来枚举$T$,最终可得

$$\sum_{T=1}^{n} \lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \sum_{i|T} f(i) \mu (\frac{T}{i})$$

完美的公式= =

那么我们只需要求出$f(i)$然后按照倍数暴力更新即可,$O(nlnn)$(其实如果本题没有$<=a$这个条件,可以直接线性筛筛出来而不需要暴力枚举,详细请见我之前的博文http://www.cnblogs.com/iwtwiioi/p/4132095.html

那么考虑当有$<=a$这个条件了,发现其实就是$f(i)<=a$,那么发现其实只需要排序一下,然后用个bit动态维护前缀和即可,最终查询用分块。

复杂度$O(nlogn+qn^{0.5}log n)$

最后来说$f(i)$的线性求法...

由于

$$f(i) = \prod_{i} \sum_{j=0}^{a[i]} p_{i}^{j},a[i]表示指数数目$$

我们考虑$f(kp_y)$,即线性筛里边的外层循环$k$和内层循环$p_y$

当$p_y | k$时

$$f(kp_y) = \prod_{i} \sum_{j=0}^{a[i]} p_{i}^{j}$$

我们在$p_y$那个指数提取一个出来,则那一部分的和变成$p_y \sum_{j=-1}^{a[y]-1} p_{y}^{j}$,将指数为$-1$的一起提出来,最终整理得

$$f(kp_y) = \prod_{i \neq y} \sum_{j=0}^{a[i]} p_{i}^{j} + p_y \prod_{i} \sum_{j=0}^{a[i]或当i=y时, a[y]-1} p_{i}^{j} = f(k去除所有p_y因子) + p_y f(k)$$

当$p_y \nmid k$时,好算多了...直接可推得

$$f(kp_y) = (1+p_y)f(k)$$

那么就大胆放到线性筛里去求吧!

【BZOJ】3529: [Sdoi2014]数表的更多相关文章

  1. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  2. bzoj 3529 [Sdoi2014]数表(莫比乌斯反演+BIT)

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a ...

  3. ●BZOJ 3529 [Sdoi2014]数表

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3529 题解: 莫比乌斯反演. 按题目的意思,令$f(i)$表示i的所有约数的和,就是要求: ...

  4. 【刷题】BZOJ 3529 [Sdoi2014]数表

    Description 有一张n×m的数表,其第i行第j列(1<=i<=n,1<=j<=m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a的数之和. In ...

  5. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)

    题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...

  6. bzoj 3529: [Sdoi2014]数表

    #include<cstdio> #include<iostream> #include<algorithm> #define M 200009 //#define ...

  7. BZOJ 3529 [Sdoi2014]数表 ——莫比乌斯反演 树状数组

    $ans=\sum_{i=1}^n\sum_{j=1}^n\sigma(gcd(i,j))$ 枚举gcd为d的所有数得到 $ans=\sum_{d<=n}\sigma(d)*g(d)$ $g(d ...

  8. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  9. 3529: [Sdoi2014]数表 - BZOJ

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数之和.给定a,计算数表中不大于a ...

随机推荐

  1. Android消息推送怎么实现?

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  2. Mysql中文乱码问题完美解决方案

    drop database`netctoss_demo` ;CREATE DATABASE `netctoss_demo` CHARACTER SET 'utf8' COLLATE 'utf8_gen ...

  3. Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏

    效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  4. JavaScript - UnderScore

    UnderScore 第一步 call(this) (function() {}.call(this)); 一些简单的初始化操作 (function() { var root = this; var ...

  5. android 入门-布局

    android:gravity 针对本view 的位置. android:layout_gravity 本view相对于父布局view的位置. android:layout_alignParentRi ...

  6. PHP json_encode中文乱码解决方法

    相信很多人在使用Ajax与后台php页面进行交互的时候都碰到过中文乱码的问题.JSON作为一种轻量级的数据交换格式,备受亲睐,但是用PHP作为后台交互,容易出现中文乱码的问题.JSON和js一样,对于 ...

  7. error C2039: “bind2nd”: 不是“std”的成员

    VS2012 出现如下错误: error C2039: "bind2nd": 不是"std"的成员     头文件中加上 #include <functi ...

  8. Arduino101学习(一)——Windows下环境配置

    一.Arduino IDE下载 要开发Arduino 101/Genuino 101,你需要先安装并配置好相应的开发环境.下载地址 http://www.arduino.cn/thread-5838- ...

  9. AndroidStudio中创建Assets文件

  10. 使用while代替for循环的几个习题

    1:兔子问题 2:100以内质数的和 3:单位给发了一张150元购物卡,拿着到超市买三类洗化用品.洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少种买法,没种买法都是各买几样? 总结:wh ...