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

这个太卡时间了,搞了我好久,不过最后跑了8s,利用了他取模的数,C++正好可以直接爆int,然后小于0就加2的31次方就行了,我就用longint强行截取了后半部分相当于爆int

首先a[i,j]上的数我们可以看成是F[gcd(i,j)],F[i]我们都预处理出来

然后我们要求的就是        ΣF[i]*g[i]     (F[i]<=a,g[i]是gcd=i的个数)

所以我们要求的就是        ΣF[i]*Σtrunc(n/d)*trunc(m/d)*μ(d/i)   (F[i]<=a,i|d)

所以我们要求的就是        Σtrunc(n/d)*trunc(m/d)*ΣF[i]*μ(d/i)   (F[i]<=a,i|d)

因为trunc(n/d)*trunc(m/d)只有根号n级别的个数,所以我们要处理ΣF[i]*μ(d/i)的前缀和,我用的是树状数组

然后每次询问都可以根号n*logn回答了

但是还有一个条件,就是F[i]<=a

前缀和还是动态的,怎么办

首先把F[i]排序是肯定的,对于每一个i,影响到的是他的倍数,这个很麻烦啊

于是就离线做了,把a排序,然后暴力修改前缀和,即枚举倍数

因为排序了,所以我们最多每个i都枚举倍数一次,应该是nlognlogn的

然后就写完了

  1 const
  2     maxn=100100;
  3     h=1<<31;
  4 type
  5     node=record
  6       n,m,a,id:longint;
  7     end;
  8 var
  9     q:array[0..maxn]of node;
 10     flag:array[0..maxn]of boolean;
 11     p,u,k,f,ans,c:array[0..maxn]of longint;
 12     t,tot,max:longint;
 13
 14 function min(x,y:longint):longint;
 15 begin
 16     if x<y then exit(x);
 17     exit(y);
 18 end;
 19
 20 procedure swap(var x,y:longint);
 21 var
 22     t:longint;
 23 begin
 24     t:=x;x:=y;y:=t;
 25 end;
 26
 27 procedure swap(var x,y:node);
 28 var
 29     t:node;
 30 begin
 31     t:=x;x:=y;y:=t;
 32 end;
 33
 34 procedure sort(l,r:longint);
 35 var
 36     i,j:longint;
 37     y:int64;
 38 begin
 39     i:=l;
 40     j:=r;
 41     y:=f[k[(l+r)>>1]];
 42     repeat
 43       while f[k[i]]<y do
 44         inc(i);
 45       while f[k[j]]>y do
 46         dec(j);
 47       if i<=j then
 48       begin
 49         swap(k[i],k[j]);
 50         inc(i);
 51         dec(j);
 52       end;
 53     until i>j;
 54     if i<r then sort(i,r);
 55     if j>l then sort(l,j);
 56 end;
 57
 58 procedure pre;
 59 var
 60     i,j,s:longint;
 61 begin
 62     f[1]:=1;
 63     u[1]:=1;
 64     for i:=2 to max do
 65       begin
 66         if flag[i]=false then
 67         begin
 68           inc(tot);
 69           p[tot]:=i;
 70           f[i]:=i+1;
 71           u[i]:=-1;
 72         end;
 73         for j:=1 to tot do
 74           begin
 75             if int64(i)*p[j]>max then break;
 76             flag[i*p[j]]:=true;
 77             if i mod p[j]=0 then
 78               begin
 79                 s:=p[j];
 80                 while i mod (int64(s)*p[j])=0 do
 81                   s:=s*p[j];
 82                 if s=i then f[i*p[j]]:=(s*p[j]*p[j]-1)div(p[j]-1)
 83                 else f[i*p[j]]:=f[i div s]*f[s*p[j]];
 84                 break;
 85               end
 86             else
 87               begin
 88                 f[i*p[j]]:=f[i]*(p[j]+1);
 89                 u[i*p[j]]:=-u[i];
 90               end;
 91           end;
 92       end;
 93     for i:=1 to max do
 94       k[i]:=i;
 95     sort(1,max);
 96 end;
 97
 98 procedure sort2(l,r:longint);
 99 var
100     i,j,y:longint;
101 begin
102     i:=l;
103     j:=r;
104     y:=q[(l+r)>>1].a;
105     repeat
106       while q[i].a<y do
107         inc(i);
108       while q[j].a>y do
109         dec(j);
110       if i<=j then
111       begin
112         swap(q[i],q[j]);
113         inc(i);
114         dec(j);
115       end;
116     until i>j;
117     if i<r then sort2(i,r);
118     if j>l then sort2(l,j);
119 end;
120
121 procedure init;
122 var
123     i:longint;
124 begin
125     read(t);
126     for i:=1 to t do
127       begin
128         read(q[i].n,q[i].m,q[i].a);
129         q[i].id:=i;
130         if q[i].n>q[i].m then swap(q[i].n,q[i].m);
131         if max<q[i].n then max:=q[i].n;
132       end;
133     sort2(1,t);
134 end;
135
136 procedure add(x,y:longint);
137 begin
138     while x<=100000 do
139       begin
140         c[x]:=longint(int64(c[x])+y);
141         x:=x+(x and (-x));
142       end;
143 end;
144
145 function sum(x:longint):longint;
146 begin
147     sum:=0;
148     while x>0 do
149       begin
150         sum:=longint(int64(sum)+c[x]);
151         x:=x-(x and (-x));
152       end;
153 end;
154
155 procedure main;
156 var
157     i,j,kk,s,lasta,s1,s2:longint;
158 begin
159     lasta:=1;
160     for i:=1 to t do
161       begin
162         while (lasta<=max) and (f[k[lasta]]<=q[i].a) do
163           begin
164             s:=k[lasta];
165             j:=1;
166             while s<=max do
167               begin
168                 if u[j]<>0 then add(s,f[k[lasta]]*u[j]);
169                 inc(s,k[lasta]);
170                 inc(j);
171               end;
172             inc(lasta);
173           end;
174         kk:=1;
175         while kk<=q[i].n do
176           begin
177             s1:=q[i].n div kk;
178             s2:=q[i].m div kk;
179             s:=min(trunc(q[i].n/s1),trunc(q[i].m/s2));
180             ans[q[i].id]:=longint(int64(ans[q[i].id])+int64(longint(int64(s1)*s2))*longint(int64(sum(s))-sum(kk-1)));
181             kk:=s+1;
182           end;
183       end;
184     for i:=1 to t do
185       if ans[i]<0 then writeln(ans[i]+h)
186       else writeln(ans[i]);
187 end;
188
189 begin
190     init;
191     pre;
192     main;
193 end.

View Code

转载于:https://www.cnblogs.com/Randolph87/p/3754593.html

3529: [Sdoi2014]数表 - BZOJ相关推荐

  1. BZOJ 3529: [Sdoi2014]数表

    二次联通门 : BZOJ 3529: [Sdoi2014]数表 Latex的公式写起来略麻烦... 设$\LARGE F(x)=\sum_{d|x} \lfloor \dfrac xd \rfloor ...

  2. BZOJ 3529: [Sdoi2014]数表 莫比乌斯

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1879  Solved: 949 [Submit][Statu ...

  3. (每日一题)P3312 [SDOI2014]数表(经典莫比乌斯反演 + 树状数组维护离线询问)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每日一题(莫反 / 多项式 / 母函数 / 群论) 2021.4.11 莫反 P3312 [SDOI2 ...

  4. P3312 [SDOI2014]数表(离线 + 树状数组前缀和优化)

    P3312 [SDOI2014]数表 推式子 ∑i=1n∑j=1mσ(gcd(i,j))∑d=1nσ(d)∑i=1nd∑j=1md[gcd(i,,j)==1]∑d=1nσ(d)∑d=1ndμ(k)nk ...

  5. [BZOJ3529][Sdoi2014]数表

    [BZOJ3529][Sdoi2014]数表 试题描述 有一张N×m的数表,其第i行第j列(1 < =i < =n,1 < =j < =m)的数值为能同时整除i和j的所有自然数 ...

  6. BZOJ3529: [Sdoi2014]数表(莫比乌斯反演,离线)

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

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

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

  8. bzoj3529: [Sdoi2014]数表

    %%%Po姐姐 https://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html [题意] 见原题 [题解] 一个数对(x,y)的公约数必定是其最大 ...

  9. bzoj乱刷计划2 19/20

    前言 话说第一个乱刷计划很顺利地完成了 感觉写成一个题表的形式还是很支持的 于是我决定再开一个.. 打算 依然是可以做自己没做过的题,也可以复习做过的.同时尽量学一些自己不会的吧 乱刷计划2 3158 ...

最新文章

  1. 圈钱跑路 ERC20 Token 合约代码分析
  2. vue-cli 3.0 跨域请求代理
  3. [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(中)
  4. 拼多多上买车,累计上线70个小时,成交订单9463笔!
  5. JMETER Debug Sampler
  6. Leetcode刷题系列汇总
  7. 协议栈 状态机 java_TCP状态机《LwIP协议栈源码详解——TCP/IP协议的实现》
  8. dosbox运行C语言,DOSBox怎么用?DOSBox使用教程
  9. iOS实现模拟定位功能
  10. 京东价格监控软件开发技术探讨一:C#实现获取京东商品信息(价格、库存)
  11. CSI-RS资源配置
  12. pat basic 1082 射击比赛
  13. 2017关于自学PHP的方法
  14. springboot项目日志记录访问客户端ip地址
  15. 规范化:范式(主属性,非主属性,1NF,2NF,3NF,BCNF:定义,例子等)
  16. 【_declspec(dllimport)】_declspec(dllimport)
  17. 通过冥想解除困意,提升精神
  18. python静态属性和静态方法_Python之路系列:面向对象初级:静态属性、静态方法、类方法...
  19. Java URL下载图片无法打开问题
  20. 编写shell脚本,输入一个数字n并计算1~n的和。要求:输入的数字不能小于1和空。

热门文章

  1. oracle自动分区如何创建本地索引吗,创建与管理Oracle分区表和本地索引的实例解析...
  2. 服务器本地打开asp文件路径,服务器本地打开asp文件
  3. Jupyter notebook最简原型界面设计 - ipywidgets与lineup_widget
  4. Qt之tcp的简单使用
  5. 「镁客·请讲」Site24×7李飞:云服务是大势所趋,云监控生意又要怎么做?...
  6. CENTOS利用Keepalived构建双主MySQL+双机热备
  7. oracle之 监听器无法启动的几个原因总结
  8. TimeSeriesChart按月进行统计时坐标对不齐的问题
  9. RocketMQ-安装使用
  10. java 工具类库 Apache Commons