bzoj3529/SDOI2014 数表(莫比乌斯函数+离散化+树状数组

本文深入探讨了一道关于数表求和的算法问题,详细分析了如何计算一张由特定规则生成的N*m数表中不大于给定值a的所有元素之和。通过引入约数和的概念,利用数学技巧进行转换,最终设计出高效的算法解决方案。

题目描述

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

输入格式

输入包含多组数据。

输入的第一行一个整数Q表示测试点内的数据组数

接下来Q行,每行三个整数n,m,a(|a| < =10^9)描述一组数据。

输出格式

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

输入输出样例
输入 #1

2
4 4 3
10 10 5

输出 #1

20
148
说明/提示
1 < =N.m < =10^5 , 1 < =Q < =2*10^4

分析

这题有点难度啊。。。
f(i)f(i)f(i) 表示 iii 的约数和
题目要求的是
ans=∑i=1n∑j=1m∑d∣i,d∣jd∗(∑d∣i,d∣jd≤a)=∑i=1n∑j=1mf(gcd(i,j))∗(f(gcd(i,j))≤a)ans = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{d|i,d|j}d*(\sum\limits_{d|i,d|j}d\leq a) =\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}f(gcd(i,j))*(f(gcd(i,j))\leq a)ans=i=1nj=1mdi,djd(di,djda)=i=1nj=1mf(gcd(i,j))(f(gcd(i,j))a)
先不考虑 aaa 的限制
我们先求求 ∑i=1n∑j=1mf(gcd(i,j))\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}f(gcd(i,j))i=1nj=1mf(gcd(i,j))
∑i=1n∑j=1mf(gcd(i,j))=∑d=1nf(d)∑i=1n∑j=1m[gcd(i,j)==d]=∑d=1nf(d)∑i=1⌊nd⌋∑j=1⌊md⌋∑x∣i,x∣jμ(x)=∑d=1nf(d)∑x=1⌊nd⌋μ(x)⌊ndx⌋⌊mdx⌋\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}f(gcd(i,j)) =\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==d]=\sum\limits_{d=1}^{n}f(d)\sum\limits_{i=1}^{{\tiny \left\lfloor\dfrac{n}{d}\right\rfloor}}\sum\limits_{j=1}^{{\tiny \left\lfloor\dfrac{m}{d}\right\rfloor}}\sum\limits_{x|i,x|j}\mu(x)=\sum\limits_{d=1}^{n}f(d)\sum\limits_{x=1}^{{\tiny\left\lfloor\dfrac{n}{d}\right\rfloor}}\mu(x)\left\lfloor\dfrac{n}{dx}\right\rfloor\left\lfloor\dfrac{m}{dx}\right\rfloori=1nj=1mf(gcd(i,j))=d=1nf(d)i=1nj=1m[gcd(i,j)==d]=d=1nf(d)i=1dnj=1dmxi,xjμ(x)=d=1nf(d)x=1dnμ(x)dxndxm
然后我们枚举 dddxxx 的乘积
那么原式等价于求
∑T=1n⌊nT⌋⌊mT⌋∑d∣Tf(d)μ(Td)\sum\limits_{T=1}^{n}\left\lfloor\dfrac{n}{T}\right\rfloor\left\lfloor\dfrac{m}{T}\right\rfloor\sum\limits_{d|T}f(d)\mu(\dfrac{T}{d})T=1nTnTmdTf(d)μ(dT)
h(T)=∑d∣Tf(d)∗μ(Td)h(T) = \sum\limits_{d|T}f(d)*\mu(\dfrac{T}{d})h(T)=dTf(d)μ(dT)
那么我们要求的就是
∑T=1n⌊nT⌋⌊mT⌋h(T)\sum\limits_{T=1}^{n}\left\lfloor\dfrac{n}{T}\right\rfloor\left\lfloor\dfrac{m}{T}\right\rfloor h(T)T=1nTnTmh(T)
现实总是很残酷的,给了个 aaa 的限制。也就是我们对于每个 aaa 只有小于 aaaf(d)f(d)f(d) 可以对 h(T)h(T)h(T) 产生贡献。
我们每次修改都是再修改 h(T)h(T)h(T) ,我们每次询问,都是要求 h(T)h(T)h(T) 的前缀和,而 h(T)h(T)h(T) 是在变化的,于是我们想到用树状数组来维护 h(T)h(T)h(T)
所以我们先将 aaa 排序,每次将小于 aaaf(d)f(d)f(d) 加入贡献,然后询问的时候除法分块就好了。
最后,由于模数是 2312^{31}231,自然溢出就好了。

代码如下

#include <bits/stdc++.h>
#define N 100005
#define LL long long
#define inf (1 << 31)
using namespace std;
int tree[N], ans[N], x[N], p[N], f[N], mu[N], g[N], pp[N], cnt, maxn = 100000;
LL z = 1, t;
struct node{
	int a, i, n, m;
	bool operator < (const node & A) const{
		return a < A.a;
	}
}d[N], e[N];
void add(int i, int x){
	for(; i <= maxn; i += i&-i) tree[i] += x;
}
int query(int i){
	int s = 0;
	for(; i; i -= i&-i) s += tree[i];
	return s;
}
int main(){
	int i, j, b, k, n, m, q, a, l, r;
	mu[1] = 1;
	for(i = 2; i <= maxn; i++){
		if(!x[i]) x[i] = i, p[++cnt] = i, mu[i] = -1;
		for(j = 1; j <= cnt; j++){
			t = z * i * p[j];
			if(t > maxn) break;
			x[t] = p[j];
			if(i % p[j] == 0) break;
			mu[t] = -mu[i];
		}
	}
	for(i = 1; i <= maxn; i++){
		for(j = 1; z * i * j <= maxn; j++){
			f[i * j] += i;
		}
		d[i].a = f[i]; d[i].i = i;
	}
	sort(d + 1, d + i);
	scanf("%d", &q);
	for(i = 1; i <= q; i++){
		scanf("%d%d%d", &e[i].n, &e[i].m, &e[i].a);
		e[i].i = i;
	}
	sort(e + 1, e + i);
	for(i = 1; i <= q; i++) pp[e[i].i] = i;
	j = 1;
	for(i = 1; i <= q; i++){
		while(j <= maxn && d[j].a <= e[i].a){
			a = d[j].a;
			b = d[j].i;
			for(k = 1; z * b * k <= maxn; k++){
				add(b * k, a * mu[k]);
			}
			j++;
		}
		n = e[i].n; m = e[i].m;
		if(n > m) swap(n, m);
		for(l = 1; l <= n; l = r + 1){
			r = min(n / (n / l), m / (m / l));
			ans[i] += (n / l) * (m / l) * (query(r) - query(l - 1));
		}
		if(ans[i] < 0) ans[i] += inf;
	}
	for(i = 1; i <= q; i++) printf("%d\n", ans[pp[i]]);
	return 0;
}
潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员与工程实践者提供系统化的潮汐建模与计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序、测站数据等),用户可自主配置模型运条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法与潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期与振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序建立潮汐动力学模型,实现潮汐现象的数字化重构与预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮与天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库与示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力与人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性与科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值