$ \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. ___pInvalidArgHandler already defined in LIBCMTD.lib(invarg.obj)

    vs2013编译项目时出错,网上很多的解决方案全都是垃圾,根本不能用 不过也有不是垃圾的,就是下面这个: 关于采用静态链接编译生成EXE库函数重复定义问题 看了好多关于类似LIBCMT.lib(inv ...

  2. Spring Data系列之Jpa(一)

    1.Spring Data的由来 Spring Data是SpringSource基金会创下的一个简化数据库访问.支持云服务的开源框架.其主要目的是让数据库访问变的方便快捷,可以用Spring Dat ...

  3. Oracle字符集的查看查询和Oracle字符集的设置修改(转)

    最近郁闷的字符集2014年7月31日16:32:58 本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题 ...

  4. 用Golang为Python编写模块

    Go里面需要显示的引入C模块, 让编译器支持生成动态链接库, 并且在代码中可以使用C语言的数据类型,这个至关重要. Calling Go code from Python code 摘取一个最简单例子 ...

  5. GIT常用命令以及作用【备忘】

    git commit  提交一个修改 git branch branchName  新建一个branchName的分支 git merge branchName 将当前分支与branchName分支合 ...

  6. NODEJS网站

    nodejs https://nodejs.org/en/ nodejs官网 http://nodeapi.ucdok.com/#/api/ nodejs手册 https://www.npmjs.co ...

  7. 2-1 gradle安装

    因为Gradle是基于JVM的,所以一定要确保本机已经安装了JDK,我们可以通过java -version来验证一下是否已经安装了JDK.  bin目录里面是两个可执行文件,一个是Windows下面的 ...

  8. java基础面试题 背过1

    web.xml文件中可以配置哪些内容? 答:web.xml用于配置Web应用的相关信息,如:监听器(listener) ContextLoaderListener .过滤器(filter) Strut ...

  9. C#request和response的中文乱码问题

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码:   ...

  10. C/C++预处理指令常见的预处理指令

    C/C++预处理指令常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifd ...