$ \color{#0066ff}{ 题目描述 }$

一天,olinr 在 luogu.org 刷题,一点提交,等了一分钟之后,又蛙又替。

olinr 发动了他的绝招,说:“为啥啊???”此时 leigehhh 拿着 6 个 map 走了过来,说:

“你这个维护一个破(pre)就行了啊” olinr 恍然大悟,问 GMPotlc,“琛哥你还有 D 吗我要

维护一个 D”。

olinr 从 GMPotlc 那里得到了一块 n*m 大小的 D,用来种植 xkj。

由于光照、二氧化碳浓度、温度等原因,olinr 得到的 D 有一个特性,对于第 i 行第 j

列种植的 xkj,一共有 lcm(i,j)个,并且营养程度为 gcd(i,j)。

olinr 希望将他的 D 的部分 xkj 出售给肯德基三人篮球赛举办方 KKF 用以在 NKFCP(全

国青少年肯德基三人篮球赛联赛)、NKFCWC(全国青少年肯德基三人篮球赛冬令营)、CKFC

(肯德基三人篮球赛中国国家队选拔赛)、IKFC(肯德基三人篮球赛全球赛)、NKFC(全国

青少年肯德基三人篮球赛)、APKFC(亚洲太平洋地区肯德基三人篮球赛)等赛事上提供服

务,KKF 为了保证 KFCers 的身心健康,只接受营养程度在[a,b]之间的 xkj,请你对于 olinr

的每次询问输出他能够出售的 xkj 数量。

\(\color{#0066ff}{输入格式}\)

第一行输入一个整数 q 代表 olinr 的询问数量

接下来 q 行每行 6 个整数 x1 x2 y1 y2 a b 表示 olinr 希望将横坐标在[x1, x2]范围并且纵

坐标在[y1, y2]范围并且营养程度在[a, b]范围的 xkj 出售。每次询问之间相互独立。

\(\color{#0066ff}{输出格式}\)

输出 q 行,每行 1 个数表示答案。由于出题人故意卡你所以请输出 mod998244353 结果

\(\color{#0066ff}{输入样例}\)

5
1 5 1 6 2 8
3 8 4 9 2 20
1 4 1 4 1 4
2 5 7 9 3 10
9 9 3 3 3 3

\(\color{#0066ff}{输出样例}\)

46
151
72
17
9

\(\color{#0066ff}{数据范围与提示}\)

对于 40%的数据,n,m,q<=1000;

对于 100%的数据,n,m<=\(10^5\) \(q<=10^4\)

我们保证每次询问数据 1<=x1<=x2<=n,1<=y1<=y2<=m,并且 1<=a<=b<=\(10^5\)。

提示:n 和 m 不会在输入中出现,但是保证满足数据范围

\(\color{#0066ff}{题解}\)

题目就是要求

\[\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)\in[l,r]]lcm(i,j)
\]

搞个前缀和

\[\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)\le r]lcm(i,j) -\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)\le l-1]lcm(i,j)
\]

对于每一个

\[\sum_{i=a}^b\sum_{j=c}^d[gcd(i,j)\le d]lcm(i,j)
\]

可以容斥一下

\[\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)\le p]\frac{i*j}{gcd(i,j)}
\]

枚举gcd

\[\sum_{d=1}^p\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]\frac{i*j}{d}
\]

把d除上去

\[\sum_{d=1}^p\sum_{i=1}^{\lfloor\frac n d \rfloor}\sum_{j=1}^{\lfloor\frac m d \rfloor}[gcd(i,j)==1]i * j * d
\]

把d提到前面

\[\sum_{d=1}^pd\sum_{i=1}^{\lfloor\frac n d \rfloor}\sum_{j=1}^{\lfloor\frac m d \rfloor}[gcd(i,j)==1]i * j
\]

利用卷积代换

\[\sum_{d=1}^pd\sum_{i=1}^{\lfloor\frac n d \rfloor}\sum_{j=1}^{\lfloor\frac m d \rfloor}\sum_{k|gcd(i,j)}\mu(k)*i * j
\]

枚举约数,形成常见的形式

\[\sum_{d=1}^pd\sum_{k=1}^{min(\lfloor\frac n d \rfloor,\lfloor\frac m d \rfloor)}\mu(k)*k*k\sum_{i=1}^{\lfloor\frac{n}{kd} \rfloor}i\sum_{j=1}^{\lfloor\frac {m}{kd} \rfloor}j
\]

然而面对多组数据,还有1e5的数据范围,这肯定是不行的

于是,我们进行kd换T

枚举T

\[\sum_{T=1}^{min(n,m)}T\sum_{d|T}^{p}\mu(\frac T d)*\frac T d\sum_{i=1}^{\lfloor\frac{n}{T} \rfloor}i\sum_{j=1}^{\lfloor\frac {m}{T} \rfloor}j
\]

要注意,中间的不能预处理!! 有限制!!

考虑把询问拆开,存成两个询问,按p从小到大排序,维护一个d的单调指针,每次把\(\le p\)的k加进去(枚举倍数,用树状数组记录前缀和

然后直接整数分块\(O(m\sqrt nlogn)\)

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int mod = 998244353;
const int maxn = 1e5 + 100;
int pri[maxn], tot;
LL mu[maxn];
bool vis[maxn];
struct node {
LL x, xx, y, yy, lim, opt, id;
friend bool operator < (const node &a, const node &b) { return a.lim < b.lim; }
node(LL x = 0, LL xx = 0, LL y = 0, LL yy = 0, LL lim = 0, LL opt = 0, LL id = 0): x(x), xx(xx), y(y), yy(yy), lim(lim), opt(opt), id(id) {}
}e[maxn << 1];
struct Tree {
protected:
LL st[maxn];
int low(int x) { return x & (-x); }
public:
void add(int pos, LL k) { while(pos < maxn) (st[pos] += k) %= mod, pos += low(pos); }
LL query(int pos) { LL re = 0; while(pos) (re += st[pos]) %= mod, pos -= low(pos); return re; }
}s;
LL getsum(LL len) {
return ((len * (len + 1)) >> 1) % mod;
}
void predoit() {
mu[1] = 1;
for(int i = 2; i < maxn; i++) {
if(!vis[i]) pri[++tot] = i, mu[i] = -1;
for(int j = 1; j <= tot && i * pri[j] < maxn; j++) {
vis[i * pri[j]] = true;
if(i % pri[j] == 0) break;
else mu[i * pri[j]] = -mu[i];
}
}
}
LL work(LL n, LL m) {
LL ans = 0;
for(LL l = 1, r; l <= std::min(n, m); l = r + 1) {
r = std::min(n / (n / l), m / (m / l));
(ans += getsum(n / l) * getsum(m / l) % mod * (((s.query(r) - s.query(l - 1)) % mod) + mod) % mod) %= mod;
}
return ans;
} LL getans(LL x, LL y, LL xx, LL yy) {
return ((work(xx, yy) - work(x - 1, yy) - work(xx, y - 1) + work(x - 1, y - 1)) % mod + mod) % mod;
}
int main() {
freopen("plot.in", "r", stdin);
freopen("plot.out", "w", stdout);
predoit();
int num = 0, T = in();
for(int i = 1; i <= T; i++) {
LL x = in(), xx = in(), y = in(), yy = in(), a = in(), b = in();
e[++num] = node(x, xx, y, yy, a - 1, -1, i);
e[++num] = node(x, xx, y, yy, b, 1, i);
}
static LL ans[maxn];
std::sort(e + 1, e + num + 1);
LL now = 1;
for(int i = 1; i <= num; i++) {
while(now <= e[i].lim) {
for(LL i = now; i < maxn; i += now) s.add(i, (((i * mu[i / now] % mod * (i / now) % mod) + mod) % mod));
now++;
}
(ans[e[i].id] += ((e[i].opt * getans(e[i].x, e[i].y, e[i].xx, e[i].yy) % mod) + mod) % mod) %= mod;
}
for(int i = 1; i <= T; i++) printf("%lld\n", ans[i]);
return 0;
}

2019.3.7考试T2 离线数论??的更多相关文章

  1. 2019.2.26考试T2 矩阵快速幂加速DP

    \(\color{#0066ff}{题解 }\) 可以发现, 数据范围中的n特别小,容易想到状压 可以想到类似于状压DP的思路,按列进行转移 那么应该有3维,\(f[i][j][k]\)代表到第i列, ...

  2. 2019.2.10考试T2, 多项式求exp+生成函数

    \(\color{#0066ff}{ 题目描述 }\) 为了减小文件大小,这里不写一堆题目背景了. 请写一个程序,输入一个数字N,输出N个点的森林的数量.点有标号. 森林是一种无向图,要求图中不能存在 ...

  3. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  4. 2019.2.25考试T3, 离线+线段树

    \(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...

  5. 2019.3.28&2019.3.30考试

    2019.3.28 : 肥肠爆芡,因为这场考试的题太屑了,所以我咕咕了 Upd on 2019.3.30 压进来一篇(因为都没啥意义) 2019.3.30 : 全机房读错题+没有大样例=T2全体爆炸 ...

  6. 2019.3.18考试&2019.3.19考试&2019.3.21考试

    2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...

  7. 2019.3.12考试&2019.3.13考试&ESTR

    过程:太菜了,不写了 T1 基环树直径,一定学 T2 树上斜率优化,类似购票,数据结构/分治算法,一定改 (把点按深度排序倒着跑2e7次斜率优化也能A,orz zyz) T3 CC原题,码码码,一定补 ...

  8. 2019.2.28&2019.3.1 考试

    因为没A/改几道题,就一起写了 题目在LOJ上都能找到 2019.2.28 100+20+12 前两个小时一直在睡觉+想题也没思路,我太菜了 T1 洗衣服 分开处理出洗衣服和烘干的时间,然后一边正着排 ...

  9. 「2019.8.11 考试」一套把OI写的很诗意的题

    这次写的更惨了,T2暴力再次挂掉了. 先写了T1的75暴力,然后写了T2的70分暴力(挂成了25),T3啥也不会骗了12分.T3看完题一点思路没有,心态爆炸了,一直在观察数据,忽略的思考的重要性,以至 ...

随机推荐

  1. sendClond如何更新邮件模板

    $url = 'http://www.sendcloud.net/webapi/template.update.json'; $API_USER = ''; $API_KEY = ''; $conte ...

  2. oracle一个创建用户、创建表空间、授权、建表的完整过程

    1.首先我们可以用scott用户以sysdba的身份登录oracle. conn scott/tiger as sysdba 2.然后我就可以来创建用户了. create user zzg ident ...

  3. ParallaxEffect

    [ParallaxEffect] ParallaxEffect是一种用简单的2D贴图来模拟3D效果的简易方法.譬如一棵树,摄像机俯视时,当树远离摄像机时,树顶偏远,当树靠近,树顶偏近.苹果官方Adve ...

  4. SPQuery DateTime 类型查询

    使用SPQuery查询时间,默认查询会忽略 时分秒,只检查日期,如果要检查时间,则必须添加 IncludeTimeValue='TRUE' 格式如下: <Where>    <Gt& ...

  5. php扩展开发2--添加类

    1.需要实现的细节 实现一个person类 实现一个doing方法和saying方法 2.第一个扩展 2.1创建类的扩展: [root@bogon ext]# cd /usr/local/src/ph ...

  6. js的两种查询方式 LHS and RHS

    为了进一步理解,我们需要多介绍一点编译器的术语.编译器在编译过程的第二步中生成了代码,引擎执行它时,会通过查找变量 a 来判断它是否已声明过.查找的过程由作用域进行协助,但是引擎执行怎样的查找,会影响 ...

  7. pyinstaller生成exe可执行程序

    1安装 略 2执行 pyinstaller –F test.py 报错: Pyinstaller: cx_Oracle.InterfaceError: Unable to acquire Oracle ...

  8. CentOS7虚拟机安装Linux教程及安装后所遇到的问题

    1.VMware Workstation15下载. 官方链接:http://download3.vmware.com/software/wkst/file/VMware-workstation-ful ...

  9. EBS登陆界面个性化

    把完整资料贴出来 Set the profile option Local Login Mask (FND_SSO_LOCAL_LOGIN_MASK). (This profile option is ...

  10. Delphi XE7 GPS控件android下的新变化

    Delphi XE7 GPS控件的Android新变化 GPS控件的Accuracy可以起作用了,Accuracy>0时:      1--100:ACCURACY_HIGH  101--500 ...