传送门

Description

有一张$n\times m$的数表,其第$i$行第$j$列 $(1≤i≤n,1≤j≤m)$ 的数值为能同时整除$i$和$j$的所有自然数之和。
现在给定$a$,计算数表中不大于$a$的数之和。

Input

输入包含多组数据。
输入的第一行一个整数$Q$表示测试点内的数据组数,接下来Q行,每行三个整数$n,m,a(a≤109)$描述一组数据。

Output

对每组数据,输出一行一个整数,表示答案模$2^{31}$的值。 

题解:

我数学太水了!!又是一道推公式的题:

\begin{aligned}
ans&=\sum^n_{i=1}\sum^m_{j=1}\sum_{d\mid gdc(i,j)}d\\
&=\sum_d^n\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}f(d)[gcd(i,j)=1] &(f(d)=\sum_{k\mid d}k)\\
&=\sum_d^n f(d)\sum^{\lfloor\frac{n}{d}\rfloor}_{i=1}\sum^{\lfloor\frac{m}{d}\rfloor}_{j=1}\sum_{k\mid gcd(i,j)}\mu(k)\\
&=\sum_k^n\sum_d^n f(d)\mu(k)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor\\
&设 T=kd \\
ans&=\sum_T^n\sum_{d\mid T}f(d)\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\\
\end{aligned}

前面同样是数论分块,后面依旧是线性筛。

考虑f怎么求

有个约数和定理

若$n=\sum_{i=1}^k p_i^{a_i}$,$p_i$为$n$的质因数,那么$n$的约数和 $f(n)$满足$f(n)=\prod_{i=1}^k\sum_{j=0}^{a_i}p_i^j$

$f$的话首先是个积性函数,我们在筛$\mu$的时候想顺便把这个也筛出来

考虑$f(d)$的值,如果说d是质数的话答案显然是$d+1$,下面讨论$d$为合数的情况

设$d=i*p$,其中$p$为质数

$p\nmid i$,那么$p$和$i$互质,所以$f(d)=f(p)*f(i)$

$p∣i$,设$i=t*p^x$ ,那么根据约数和定理,我们可以得
$$f(i*p) = f(t)f(p^{x+1}) = f(t)\sum\limits_{i=0}^{x+1}p^i$$

然后我们把p0(也就是1)拿出来,得到
$$f(i * p) = f(t) + f(t)*\sum\limits_{i=1}^{x+1}p^i = f(t) + f(t)*f(p^x)*p$$

然后$i = t * p^x$,所以$f(t) * f(p^x) = f(i)$

所以最后就是$f(d) = f(t) + f(i) * p$

然后就可以筛出$f(d)$啦

剩下的东西

现在加上a的限制,其实就是离线处理

我们先将所有的询问按照a的大小排序,然后从小到大处理

因为分块的时候我们要用到的是g(x)的前缀和,所以用一个树状数组来处理

将f(x)排个序,枚举的时候只枚举到f(x)<a,然后枚举另一个约数求出g,丢到树状数组里面去

求答案的时候直接查询就好了

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5.  
  6. #define lowbit(x) (x&-x)
  7. int T,cnt=,maxn,ans[],tmp[];
  8. int f[],pri[],c[],mu[];
  9. bool vis[];
  10. struct Que{
  11. int n,m,a,id;
  12. bool operator<(const Que &b)const{
  13. return a<b.a;
  14. }
  15. }q[];
  16.  
  17. bool comp(int a,int b){return f[a]<f[b];}
  18.  
  19. void init(){
  20. mu[]=f[]=;
  21. for(int i=;i<=maxn;i++){
  22. if(!vis[i]){
  23. f[i]=i+,mu[i]=-;
  24. pri[++cnt]=i;
  25. }
  26. for(int j=;j<=cnt&&i*pri[j]<=maxn;j++){
  27. vis[i*pri[j]]=true;
  28. if(i%pri[j]==){
  29. mu[i*pri[j]]=;
  30. int t=i;
  31. while(t%pri[j]==)t/=pri[j];
  32. f[i*pri[j]]=f[t]+pri[j]*f[i];
  33. break;
  34. }else{
  35. f[i*pri[j]]=f[i]*f[pri[j]];
  36. mu[i*pri[j]]=-mu[i];
  37. }
  38. }
  39. }
  40. }
  41.  
  42. void add(int x,int y){
  43. while(x<=maxn){
  44. c[x]+=y;
  45. x+=lowbit(x);
  46. }
  47. }
  48.  
  49. int sum(int x){
  50. int ans=;
  51. while(x>=){
  52. ans+=c[x];
  53. x-=lowbit(x);
  54. }
  55. return ans;
  56. }
  57.  
  58. int main(){
  59. scanf("%d",&T);
  60. for(int i=;i<=T;i++){
  61. scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a);
  62. q[i].id=i;
  63. if(q[i].n>q[i].m)swap(q[i].n,q[i].m);
  64. maxn=max(maxn,q[i].n);
  65. }
  66. init();
  67. sort(q+,q+T+);
  68. for(int i=;i<=maxn;i++)tmp[i]=i;
  69. sort(tmp+,tmp+maxn+,comp);
  70. for(int i=,now=;i<=T;i++){
  71. int n=q[i].n,m=q[i].m,a=q[i].a;
  72. while(now<=maxn&&f[tmp[now]]<=a){
  73. for(int k=;k*tmp[now]<=maxn;k++)
  74. add(k*tmp[now],f[tmp[now]]*mu[k]);
  75. now++;
  76. }
  77. for(int j=,pos;j<=n;j=pos+){
  78. pos=min(n/(n/j),m/(m/j));
  79. ans[q[i].id]+=(n/j)*(m/j)*(sum(pos)-sum(j-));
  80. }
  81. }
  82. for(int i=;i<=T;i++)
  83. printf("%d\n",ans[i]&0x7fffffff);
  84. }

【BZOJ3529】【SDOI2014】数表 (莫比乌斯反演+树状数组)的更多相关文章

  1. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演 树状数组)

    题意 题目链接 Sol 首先不考虑\(a\)的限制 我们要求的是 \[\sum_{i = 1}^n \sum_{j = 1}^m \sigma(gcd(i, j))\] 用常规的套路可以化到这个形式 ...

  2. 【BZOJ3529】[Sdoi2014]数表 莫比乌斯反演+树状数组

    [BZOJ3529][Sdoi2014]数表 Description 有一张N×m的数表,其第i行第j列(1 < =i < =礼,1 < =j < =m)的数值为能同时整除i和 ...

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

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

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

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

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

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

  6. 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 ...

  7. luogu3312 [SDOI2014]数表 (莫比乌斯反演+树状数组)

    link \(\sum_{i=1}^n\sum_{j=1}^m[s(\gcd(i,j))\le a]s(\gcd(i,j))\) \(=\sum_{p=1}^ns(p)[s(p)\le a]\sum_ ...

  8. 【BZOJ3529】【莫比乌斯反演 + 树状数组】[Sdoi2014]数表

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

  9. bzoj 3529 数表 莫比乌斯反演+树状数组

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

随机推荐

  1. C语言实现两数相加2018-09-23

    /*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...

  2. 关于bc中小数点length,scale,(())以及进制转换

    这是我在codewar上遇到的一个题,我用我自己的方法做出了解答,如下: 1 #!/bin/bash 2 3 distance=`echo "$1*10000"|bc|cut -d ...

  3. JS - encodeURI与encodeURIComponent的区别

    encodeURI(String)主要用于整个URI(例如,http://www.jxbh.cn/illegal value.htm),而encodeURIComponent(String)主要用于对 ...

  4. 03IO端口寻址和访问控制方式

    1. I/O端口和寻址 CPU 为了访问 I/O 接口控制器或者控制卡上的数据和状态信息,需要首先指定他们的地址.这种地址就称为I/O端口地址或简称端口.通常一个 I/O 控制器包含访问数据的数据端口 ...

  5. vue 使用lib-flexable,px2rem 进行移动端适配 但是引入的第三方UI组件 vux 的样式缩小,解决方案

    最近在写移动端项目,就想用lib-flexable,px2rem来进行适配,把px转换成rem但是也用到了第三方UI组件库vux,把这个引入发现一个问题就是vux的组件都缩小了,在网上找不到答案,最后 ...

  6. vue实现与安卓、IOS交互

    方案背景 IOS用的是jsBridge插件实现调用.传参.回调的 安卓是在window挂载方法和挂载回调的 IOS实现方案 调用原生方法封装如下 function setupWebViewJavasc ...

  7. 第7课 Thinkphp 5 模板输出变量使用函数 Thinkphp5商城第四季

    目录 1. 手册地址: 2. 如果前面输出的变量在后面定义的函数的第一个参数,则可以直接使用 3. 还可以支持多个函数过滤,多个函数之间用"|"分割即可,例如: 4. 变量输出使用 ...

  8. 15.Yii2.0框架where单表查询

    目录 新建控制器 HomeController.php 新建model article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...

  9. crm项目之整体内容(一)

    一.项目背景 YW公司是一家电池供应商,目前由于公司内部的需要,需要做一个CRM项目,需要每一个不同角色的员工登陆系统后处理自己的事情.其流程大致如下: 其项目包括三部分内容: 1.权限分配组件(rb ...

  10. vim中,在编辑模式下如何快速移动光标

    编辑 ~/.vimrc 配置文件,加入如下行,编辑模式下自定义的快捷键 inoremap <C-o> <Esc>o  inoremap <C-l> <Righ ...