Description

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

Input

输入包含多组数据。

输入的第一行一个整数Q表示测试点内的数据组数,接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。

Output

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

Sample Input

2

4 4 3

10 10 5

Sample Output

20

148

HINT

1<=n,m<=10^5 , 1<=Q<=2×10^4

Solution

莫比乌斯反演,膜拜PoPoQQQ

先不管a的限制,我们直接求数表中所有数之和\(ans'\)

设\(F(i)\)为i的约数和,\(g(i)\)为在限制n和m范围内gcd为i的对数的个数,那么

\[ans'=\sum_{i=1}^{min(n,m)}F(i)g(i)
\]

\(g(i)\)的反演已经是老套路了,直接得出\(g(i)=\sum_{i|d}\mu(\frac{d}{n})\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor\)

继续推

\[ans'=\sum_{i=1}^{min(n,m)}F(i)\sum_{i|d}\mu(\frac{d}{i})\lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor=\sum_{i=1}^{min(n,m)}F(i)\sum_{k=1}^{\lfloor \frac{min(n,m)}{i} \rfloor}\mu(k)\lfloor \frac{n}{ik} \rfloor \lfloor \frac{m}{ik} \rfloor
\]

设\(T=ik\)

\[ans'=\sum_{T=1}^{min(n,m)}\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor\sum_{k=1}^{\lfloor \frac{min(n,m)}{T} \rfloor}F(k)\mu(\lfloor \frac{T}{k} \rfloor)
\]

前面部分整除分块,我们只要处理出后半部分的前缀和就行了

对于\(F(k)\)直接\(O(nlog_2n)\)暴力枚举约数和它的倍数

对于\(\mu\)这就不用说了吧。。。(看之前的文章)

好的,我们把改装之后的问题解决了,可是原问题呢?

回到真正的\(ans\),因为有a的限制,所以那些\(F(i)\)大于a的是不能加贡献的

那么我们把询问按a排序,然后用树状数组维护\(F(k)\mu(\lfloor \frac{T}{k} \rfloor)\)的前缀和,只有当前询问的a大于扫描到的\(F(i)\),才把\(F(i)\)能产生的贡献加入树状数组。这样就保证了不改加入的贡献不会被加入

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. const int MAXT=20000+10,MAXN=100000+10,Mod=0x7fffffff;
  4. int T,cnt,vis[MAXN],prime[MAXN],mu[MAXN],C[MAXN],ans[MAXT],limit;
  5. struct question{
  6. int n,m,a;
  7. int id;
  8. inline bool operator < (const question &A) const{
  9. return a<A.a;
  10. };
  11. };
  12. question Q[MAXT];
  13. struct node{
  14. int s;
  15. int id;
  16. inline bool operator < (const node &A) const{
  17. return s<A.s;
  18. };
  19. };
  20. node F[MAXN];
  21. template<typename T> inline void read(T &x)
  22. {
  23. T data=0,w=1;
  24. char ch=0;
  25. while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
  26. if(ch=='-')w=-1,ch=getchar();
  27. while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
  28. x=data*w;
  29. }
  30. template<typename T> inline void write(T x,char c='\0')
  31. {
  32. if(x<0)putchar('-'),x=-x;
  33. if(x>9)write(x/10);
  34. putchar(x%10+'0');
  35. if(c!='\0')putchar(c);
  36. }
  37. template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
  38. template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
  39. template<typename T> inline T min(T x,T y){return x<y?x:y;}
  40. template<typename T> inline T max(T x,T y){return x>y?x:y;}
  41. inline void init()
  42. {
  43. for(register int i=1;i<=limit;++i)
  44. for(register int j=i;j<=limit;j+=i)F[j].s+=i;
  45. for(register int i=1;i<=limit;++i)F[i].id=i;
  46. std::sort(F+1,F+limit+1);
  47. memset(vis,1,sizeof(vis));
  48. vis[0]=vis[1]=0;
  49. mu[1]=1;
  50. for(register int i=2;i<=limit;++i)
  51. {
  52. if(vis[i])
  53. {
  54. prime[++cnt]=i;
  55. mu[i]=-1;
  56. }
  57. for(register int j=1;j<=cnt&&i*prime[j]<=limit;++j)
  58. {
  59. vis[i*prime[j]]=0;
  60. if(i%prime[j])mu[i*prime[j]]=-mu[i];
  61. else break;
  62. }
  63. }
  64. }
  65. inline int lowbit(int x)
  66. {
  67. return x&(-x);
  68. }
  69. inline int sum(int x)
  70. {
  71. int res=0;
  72. while(x)
  73. {
  74. res+=C[x];
  75. x-=lowbit(x);
  76. }
  77. return res;
  78. }
  79. inline void add(int x,int k)
  80. {
  81. while(x<=limit)
  82. {
  83. C[x]+=k;
  84. x+=lowbit(x);
  85. }
  86. }
  87. inline int solve(int n,int m)
  88. {
  89. int res=0;
  90. for(register int i=1;;)
  91. {
  92. if(i>min(n,m))break;
  93. int j=min(n/(n/i),m/(m/i));
  94. res+=(n/i)*(m/i)*(sum(j)-sum(i-1));
  95. i=j+1;
  96. }
  97. return res&Mod;
  98. }
  99. int main()
  100. {
  101. read(T);
  102. for(register int i=1;i<=T;++i)
  103. {
  104. read(Q[i].n);read(Q[i].m);read(Q[i].a);
  105. Q[i].id=i;
  106. chkmax(limit,min(Q[i].n,Q[i].m));
  107. }
  108. init();
  109. std::sort(Q+1,Q+T+1);
  110. for(register int i=1,j=1;i<=T;++i)
  111. {
  112. while(j<=limit&&F[j].s<=Q[i].a)
  113. {
  114. for(register int p=F[j].id,k=1;p<=limit;p+=F[j].id,++k)add(p,F[j].s*mu[k]);
  115. ++j;
  116. }
  117. ans[Q[i].id]=solve(Q[i].n,Q[i].m);
  118. }
  119. for(register int i=1;i<=T;++i)write(ans[i],'\n');
  120. return 0;
  121. }

【刷题】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]数表

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

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

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

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

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

  5. bzoj 3529: [Sdoi2014]数表

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

  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. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

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

  8. 3529: [Sdoi2014]数表 - BZOJ

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

  9. 【BZOJ】3529: [Sdoi2014]数表

    题意:求 $$\sum_{i=1}^{n} \sum_{j=1}^{m} \sum_{d|(i, j)} d 且 (\sum_{d|(i, j)} d)<=a$$ n, m<=1e5,q次 ...

随机推荐

  1. C# 连接MongoDB,含用户验证

    配置文件中链接地址:mongodb://test:123456@192.168.168.186:9999/temp 读取配置文件: /// <summary> /// 构造函数 /// & ...

  2. JUC——线程同步锁(ReentrantReadWriteLock读写锁)

    读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...

  3. 关于python中的tkinter模块

    python2.7和python3.6中的tkinter是两个包,不会自动升级,假如在fedora28做开发的话, 错误:用import Tkinter /import tkinter /import ...

  4. Tomcat分析

    最近闲来无事,总结了一下tomcat的一些知识,分享出来供大家参考,如有错误,请及时与我联系. 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置 ...

  5. unzip/tar命令详解

    博客目录总纲首页 原文链接:https://www.cnblogs.com/zdz8207/p/3765604.html Linux下的压缩解压缩命令详解及实例 实例:压缩服务器上当前目录的内容为xx ...

  6. passwd命令详解

    基础命令学习目录首页 passwd命令用于设置用户的认证信息,包括用户密码.密码过期时间等.系统管理者则能用它管理系统用户的密码.只有管理者可以指定用户名称,一般用户只能变更自己的密码. 语法 pas ...

  7. Docker容器和本机之间的文件传输 使用Docker部署Tomcat项目

    Docker容器和本机之间的文件传输. http://blog.csdn.net/leafage_m/article/details/72082011 使用Docker部署Tomcat项目 http: ...

  8. 软件功能说明书beta修订

    贪吃蛇(单词版)软件功能说明书beta修订 1 开发背景 “贪吃蛇”这个游戏对于80,90后的人来说是童年的记忆,可以将其说为是一个时代的经典,实现了传统贪吃蛇的游戏功能:现在人们对英语的重视程度越来 ...

  9. mybatis oracle和mysql like模糊查询写法

    oracle:RESOURCE_NAME LIKE '%' || #{resourceName} || '%'mysql:RESOURCE_NAME like concat(concat(" ...

  10. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...