3529: [Sdoi2014]数表

Description

有一张N×m的数表,其第i行第j列(1 < =i < =礼,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
 
 
【分析】
  
  先假设没有a的限制。。
  设g(i)=ΣΣ[(x,y)==i](1<=x<=n,1<==y<=m)
     g(i)=Σmu[d]*(n/(i*d))*(m/(i*d))
     尝试把i和d分开,设D=i*d
  那么g(i)=(n/D)*(M/D)*Σmu[i/D]  (i|D)
  设f(i)为i的约数和,这个可以nlogn求出来,那么ans=g(i)*f(i)=(n/D)*(M/D)*Σmu[i/D]*f(i) (i|D)
 
  对于a的限制,是说f(i)<=a的东西对ans有贡献,其他的没有贡献。
  所以就离线一下~~按照f(i)排序,询问按照a排序,因为要询问前缀和,所以当他开始有贡献的时候就把他放到树状数组里面去。
  剩下的就是分块处理了。
 
  Mod的地要自然溢出最后取模?不然会超时,像我一样~
 
 

  别人的题解:

 
 
代码如下:
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. using namespace std;
  9. #define Maxn 100010
  10. #define LL unsigned int
  11. #define INF 0xfffffff
  12. LL mx;
  13. LL Mod;
  14.  
  15. int mu[Maxn];
  16. LL pri[Maxn],pl;
  17. bool q[Maxn];
  18.  
  19. struct node
  20. {
  21. LL x,y,a,ans,id;
  22. }t[Maxn],f[Maxn];
  23.  
  24. LL mymin(LL x,LL y) {return x<y?x:y;}
  25. LL mymax(LL x,LL y) {return x>y?x:y;}
  26.  
  27. bool cmp(node x,node y) {return x.a<y.a;}
  28. bool cmp2(node x,node y) {return x.id<y.id;}
  29.  
  30. void get_mu()
  31. {
  32. pl=;
  33. memset(q,,sizeof(q));
  34. mu[]=;
  35. for(LL i=;i<=mx;i++)
  36. {
  37. if(q[i])
  38. {
  39. pri[++pl]=i;
  40. mu[i]=-;
  41. }
  42. for(LL j=;j<=pl;j++)
  43. {
  44. if(i*pri[j]>mx) break;
  45. q[i*pri[j]]=;
  46. if(i%pri[j]==) mu[i*pri[j]]=;
  47. else mu[i*pri[j]]=-mu[i];
  48. if(i%pri[j]==) break;
  49. }
  50. }
  51. for(LL i=;i<=mx;i++) f[i].a=;
  52. for(LL i=;i<=mx;i++)
  53. for(LL j=i;j<=mx;j+=i)
  54. f[j].a=f[j].a+i;
  55. for(LL i=;i<=mx;i++) f[i].id=i;
  56. }
  57.  
  58. LL c[Maxn],as[Maxn];
  59.  
  60. LL add(LL x,LL y)
  61. {
  62. as[x]+=y;
  63. for(LL i=x;i<=mx;i+=i&(-i))
  64. c[i]+=y;
  65. }
  66.  
  67. LL get_sum(LL x)
  68. {
  69. LL ans=;
  70. for(LL i=x;i>=;i-=i&(-i))
  71. ans+=c[i];
  72. return ans;
  73. }
  74.  
  75. void change(LL x)
  76. {
  77. LL now=f[x].id;
  78. for(LL i=now;i<=mx;i+=now)
  79. add(i,(LL)(mu[i/now]*f[x].a));
  80. }
  81.  
  82. LL get_ans(LL n,LL m)
  83. {
  84. LL ans=,t;
  85. if(n>m) t=n,n=m,m=t;
  86.  
  87. LL sq=(LL)ceil(sqrt((double)m));
  88. for(LL i=;i<=mymin(sq,n);i++)
  89. {
  90. LL x=(LL)(n/i),y=(LL)(m/i);
  91. ans+=as[i]*(n/i)*(m/i);
  92. }
  93.  
  94. for(LL i=sq+;i<=n;)
  95. {
  96. LL x=n/i,y=m/i;
  97. LL r1=n/x+,r2=m/y+;
  98. if(r1>n+) r1=n+;
  99. if(r2>n+) r2=n+;
  100. LL r=mymin(r1,r2);
  101.  
  102. ans+=(get_sum(r-)-get_sum(i-))*x*y;
  103. i=r;
  104. }
  105.  
  106. return ans;
  107. }
  108.  
  109. int main()
  110. {
  111. Mod=;
  112. for(LL i=;i<=;i++) Mod*=;
  113.  
  114. LL T;
  115. T=;
  116. scanf("%d",&T);
  117.  
  118. mx=;
  119.  
  120. for(LL i=;i<=T;i++)
  121. {
  122. scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].a);
  123. mx=mymax(mx,mymin(t[i].x,t[i].y));
  124. t[i].id=i;
  125. }
  126. sort(t+,t++T,cmp);
  127. get_mu();
  128. sort(f+,f++mx,cmp);
  129.  
  130. memset(c,,sizeof(c));
  131. memset(as,,sizeof(as));
  132. LL now=;
  133. for(LL i=;i<=T;i++)
  134. {
  135. while(f[now].a<=t[i].a&&now<=mx) change(now),now++;
  136. t[i].ans=get_ans(t[i].x,t[i].y);
  137. }
  138. sort(t+,t++T,cmp2);
  139.  
  140. for(LL i=;i<=T;i++)
  141. {
  142. printf("%d\n",(t[i].ans%Mod+Mod)%Mod);
  143. }
  144. return ;
  145. }

[BZOJ 3529]

2016-09-03 10:57:57

 

【BZOJ 3529】 [Sdoi2014]数表 (莫比乌斯+分块+离线+树状数组)的更多相关文章

  1. 【bzoj3529】[Sdoi2014]数表 莫比乌斯反演+离线+树状数组

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

  2. BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...

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

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

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

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

  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. BZOJ 1878: [SDOI2009]HH的项链 离线树状数组

    1878: [SDOI2009]HH的项链 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  7. 【BZOJ3529】数表(莫比乌斯反演,树状数组)

    [BZOJ3529]数表(莫比乌斯反演,树状数组) 题解 首先不管\(A\)的范围的限制 要求的东西是 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))\] 其中\ ...

  8. P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  9. bzoj 2434: 阿狸的打字机 fail树+离线树状数组

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=2434 题解: 首先我们可以发现这个打字的过程本身就是在Trie上滚来滚去的过程 所以我们 ...

随机推荐

  1. Linux下pcapy的安装问题

    在安装pcapy包的时候 cd pcapy-0.10.8/ python setup.py install 报错 error trying to exec ‘cc1plus’: execvp: No ...

  2. js 注册手机摇动事件

    var rockModule = (function () { //监听手机摇动事件 if (window.DeviceMotionEvent) { window.addEventListener(' ...

  3. String sql = "update web_admin set adminname=? ,password=? where id=?;怎么给“?” 传值?

    PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES                                ...

  4. C#数组按值和按引用传递数组区别

    C#中,存储数组之类对象的变量并不是实际存储对象本身,而是存储对象的引用.按值传递数组时,程序将变量传递给方法时,被调用方法接受变量的一个副本,因此在被调用时试图修改数据变量的值时,并不会影响变量的原 ...

  5. Android应用不随手机屏幕旋转的方法

    在主配置文件里面.在需要设置的activity项后面加上 android:screenOrientation="portrait",这个activity就保持竖屏显示了:在每个ac ...

  6. FOR XML PATH 应用及其反向分解

    数据库环境:SQL SERVER 2005 我们实现将同一组的数据内容合并到一行的时候,可以通过FOR XML PATH来实现. 有数据如图1,要实现图2的效果              1.图1到图 ...

  7. Java工具类:获取long型唯一ID

    直接上代码: import java.text.SimpleDateFormat; import java.util.Date; /** * 获取long型唯一ID */ public class I ...

  8. Quartz2.2.1操作手册

    一.初识quartz JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1") ...

  9. 10_Mybatis开发Dao方法——mapper代理实现

    [工程截图(几个关键的标红框)] [UserMapper.xml] <?xml version="1.0" encoding="UTF-8"?> & ...

  10. 【制作镜像】安装VMwareTool

    vmware tools是虚拟机VMware Workstation自带的一款工具,它的作用就是使用户可以从物理主机直接往虚拟机里面拖文件. 启动虚拟机,切换到xwindows 在VMware Wor ...