传送门

不考虑$a$的影响

设$f(i)$为$i$的约数和

$$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$

$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\sum\limits_{j=1}^{\lfloor \frac m d \rfloor } [gcd(i,j)==1]$$

这个东西直接反演一下

$$=\sum\limits_{d=1}^nf(d)\sum\limits_{i=1}^{\lfloor \frac n d \rfloor}\mu(i) \lfloor \frac n {di} \rfloor \lfloor \frac m {di} \rfloor$$

然后转为枚举$di$

$$=\sum\limits_{D=1}^{n}\sum\limits_{d|D}f(d)\mu(\frac D d) \lfloor \frac n {D} \rfloor \lfloor \frac m {D} \rfloor$$

对于每一个$i$可以用整除分块把它前缀和的贡献算出来,然后用树状数组动态维护前缀和

然后我们考虑$a$的限制。把所有询问离线按$a$排序,从小到大处理处理询问,每处理到一个询问就把所有的$f(d)<=a$的$d$的贡献都累加起来,直接树状数组查询一下就可以了

然后听大佬们说这题取模直接自然溢出就可以了,然后不知道为啥最后还要$\&$一个$0x7fffffff$

  1. //minamoto
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #define ui unsigned int
  6. using namespace std;
  7. #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  8. char buf[<<],*p1=buf,*p2=buf;
  9. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
  10. inline int read(){
  11. #define num ch-'0'
  12. char ch;bool flag=;int res;
  13. while(!isdigit(ch=getc()))
  14. (ch=='-')&&(flag=true);
  15. for(res=num;isdigit(ch=getc());res=res*+num);
  16. (flag)&&(res=-res);
  17. #undef num
  18. return res;
  19. }
  20. char sr[<<],z[];int C=-,Z;
  21. inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
  22. inline void print(int x){
  23. if(C><<)Ot();if(x<)sr[++C]=,x=-x;
  24. while(z[++Z]=x%+,x/=);
  25. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  26. }
  27. const int N=1e5;
  28. int p[N];ui mu[N+],f[N+],c[N+],ans[N+];
  29. int a[N+],m,q,n,vis[N+];
  30. struct node{
  31. int n,m,val,id;
  32. node(){}
  33. node(int n,int m,int val,int id):n(n),m(m),val(val),id(id){}
  34. inline bool operator <(const node &b)const
  35. {return val<b.val;}
  36. }t[N];
  37. inline bool cmp(const int &a,const int &b){return f[a]<f[b];}
  38. inline void add(int x,ui y){
  39. for(;x<=N;x+=x&-x) c[x]+=y;
  40. }
  41. inline ui query(int x){
  42. ui res=;
  43. for(;x;x-=x&-x) res+=c[x];
  44. return res;
  45. }
  46. void init(){
  47. mu[]=;
  48. for(int i=;i<=N;++i){
  49. if(!vis[i]) p[++m]=i,mu[i]=-;
  50. for(int j=;j<=m&&p[j]*i<=N;++j){
  51. vis[i*p[j]]=;
  52. if(i%p[j]==) break;
  53. mu[i*p[j]]=-mu[i];
  54. }
  55. }
  56. for(int i=;i<=N;++i)
  57. for(int j=i;j<=N;j+=i)
  58. f[j]+=i;
  59. for(int i=;i<=N;++i) a[i]=i;
  60. sort(a+,a++N,cmp);
  61. }
  62. int main(){
  63. // freopen("testdata.in","r",stdin);
  64. init();
  65. q=read();
  66. for(int i=,x,y,z;i<=q;++i){
  67. x=read(),y=read(),z=read();
  68. if(x>y) swap(x,y);cmax(z,);
  69. t[i]=node(x,y,z,i);
  70. }
  71. sort(t+,t+q+);
  72. for(int i=,j=,k;i<=q;++i){
  73. for(;f[a[j]]<=t[i].val;++j)
  74. for(k=a[j];k<=N;k+=a[j])
  75. add(k,f[a[j]]*mu[k/a[j]]);
  76. for(int l=,r;l<=t[i].n;l=r+){
  77. r=min(t[i].n/(t[i].n/l),t[i].m/(t[i].m/l));
  78. ans[t[i].id]+=(t[i].n/l)*(t[i].m/l)*(query(r)-query(l-));
  79. }
  80. }
  81. for(int i=;i<=q;++i) print(ans[i]&0x7fffffff);
  82. Ot();
  83. return ;
  84. }

洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

  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. bzoj 3529 数表 莫比乌斯反演+树状数组

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

  9. 洛谷 P3312 [SDOI2014]数表 解题报告

    P3312 [SDOI2014]数表 题目描述 有一张\(N*M\)的数表,其第\(i\)行第\(j\)列(\(1\le i \le n\),\(1 \le j \le m\))的数值为能同时整除\( ...

随机推荐

  1. TEA对称加密算法

    今天在看<Distributed Systems Concepts and Design>这本书的时候,在讲到分布式系统的安全性的时候,给出了TEA算法,书本上有现成的代码,所以摘录下来以 ...

  2. SVD分解的理解

    对称阵A 相应的,其对应的映射也分解为三个映射.现在假设有x向量,用A将其变换到A的列空间中,那么首先由U'先对x做变换: 由于正交阵“ U的逆=U‘ ”,对于两个空间来讲,新空间下的“ 基E' 坐标 ...

  3. 15款创建美丽幻灯片的 jQuery 插件

    1. Skippr Skippr 是一个超级简单的 jQuery 幻灯片插件.仅仅是包含你的网页中引入 jquery.skippr.css 和 jquery.skippr.js 文件就能使用了. Sk ...

  4. java中科学计数法数字转字符串

    开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...

  5. win10安装VMware

    首先下载VMware安装包: 双击安装: 点击:“uninstall”安装,这个过程需要一些时间 点击“Next” 选择典型或者自定义安装 这里我选择的是典型安装,点击“Next”: 选择是否检查更新 ...

  6. [CPP] Coding Style

    C++ Coding Style C++很多强大的语言特性导致它的复杂,其复杂性会使得代码更容易出现bug.难于阅读和维护. 由于,本人有一点点代码洁癖,所以依照Google的C++编程规范<G ...

  7. Double.valueOf()与Double.parseDouble()两者的区别

    写代码用到这两个方法,不知道有什么区别,看一下源码: Double.parseDouble(String str) public static double parseDouble(String s) ...

  8. BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器

    题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1001 题解: 1.trie树 关 ...

  9. jinja 多值合并

    示例 {% for node in groups["db"] %} {{ node | join("") }}:5672 {% if not loop.last ...

  10. webstorm代码提示按键改为alt+/

    webstorm代码提示默认按键为ctrl+空格 但是windows输入法中英文输入法的默认按键也是ctrl+空格 这就导致webstorm按键冲突,无法使用代码快捷提示按键 解决方法: 按ctrl+ ...