多校联测11 模板题

文章讲述了如何利用多项式乘法计算两个多项式的乘积,并针对特定质数求和的模运算问题进行优化,通过构造系数并使用前缀和减少时间复杂度,最后提供了优化后的代码实现。

题目大意

给你四个整数 n , m , s e e d , w n,m,seed,w n,m,seed,w,其中 n , m n,m n,m为两个多项式 A ( x ) = ∑ i = 0 n a i x i A(x)=\sum\limits_{i=0}^na_ix^i A(x)=i=0naixi B ( x ) = ∑ i = 0 m b i x i B(x)=\sum\limits_{i=0}^mb_ix^i B(x)=i=0mbixi的最高次数, s e e d , w seed,w seed,w是用来生成 a i a_i ai b i b_i bi的参数。

C ( x ) = A ( x ) B ( x ) = ∑ i = 0 n + m c i x i C(x)=A(x)B(x)=\sum\limits_{i=0}^{n+m}c_ix^i C(x)=A(x)B(x)=i=0n+mcixi

q q q次询问,第 i i i次输入 l i , r i l_i,r_i li,ri,求 ∑ j = l i r i c j \sum\limits_{j=l_i}^{r_i}c_j j=liricj 1145141999 1145141999 1145141999 1145141999 = 2 × 7 × 11 × 13 × 17 × 33647 + 1 1145141999=2\times 7\times 11\times 13\times 17\times 33647+1 1145141999=2×7×11×13×17×33647+1,是一个质数)取模后的值。

构造 a i a_i ai b i b_i bi的代码如下,可以对其进行修改来完成此题。

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long u64;
const int p=1145141999;
int a[10000005],b[10000005];
int n,m,q,w;
u64 seed;
u64 rnd()
{
	u64 x = seed;
	x ^= x << 13;
	x ^= x >> 7;
	x ^= x << 17;
	return seed = x;
}
int main(){
	scanf("%d%d%llu%d",&n,&m,&seed,&w);
	scanf("%d",&q);
	for(int i=0;i<=n;++i)a[i]=rnd()%w;
	for(int i=0;i<=m;++i)b[i]=rnd()%w;
	int l,r;
	for(int i=1;i<=q;++i){
		scanf("%d%d",&l,&r);
	}
	return 0;
}

1 ≤ n ≤ 6 × 1 0 6 , 1 ≤ q ≤ 25 , 1 ≤ w ≤ 1145141999 1\leq n\leq 6\times 10^6,1\leq q\leq 25,1\leq w\leq 1145141999 1n6×106,1q25,1w1145141999


题解

C ( x ) = A ( x ) B ( x ) = ∑ i = 0 n + m ( ∑ j = 0 i a j b i − j ) x i C(x)=A(x)B(x)=\sum\limits_{i=0}^{n+m}(\sum\limits_{j=0}^ia_jb_{i-j})x^i C(x)=A(x)B(x)=i=0n+m(j=0iajbij)xi

也就是说, c i = ∑ j = 0 i a j b i − j c_i=\sum\limits_{j=0}^ia_jb_{i-j} ci=j=0iajbij

那么, ∑ i = 0 t c i = ∑ i = 0 t ∑ j = 0 i a j b i − j = ∑ j = 0 t a j ∑ i = 0 t − j b i \sum\limits_{i=0}^tc_i=\sum\limits_{i=0}^t\sum\limits_{j=0}^ia_jb_{i-j}=\sum\limits_{j=0}^ta_j\sum\limits_{i=0}^{t-j}b_i i=0tci=i=0tj=0iajbij=j=0taji=0tjbi

b i b_i bi的前缀和为 s u m i {sum}_i sumi S ( t ) = ∑ i = 0 t a i s u m t − i S(t)=\sum\limits_{i=0}^ta_i{sum}_{t-i} S(t)=i=0taisumti,则答案为 S ( r ) − S ( l − 1 ) S(r)-S(l-1) S(r)S(l1)

S ( t ) S(t) S(t)的时间复杂度为 O ( n ) O(n) O(n),所以总时间复杂度为 O ( n q ) O(nq) O(nq)

code

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long u64;
const long long p=1145141999;
int a[20000005],b[20000005],sum[20000005];
int n,m,q,w;
u64 seed;
u64 rnd()
{
	u64 x = seed;
	x ^= x << 13;
	x ^= x >> 7;
	x ^= x << 17;
	return seed = x;
}
long long gt(int t){
	long long re=0;
	for(int i=0;i<=t;i++){
		re=(re+1ll*a[i]*sum[t-i])%p;
	}
	return re;
}
int main(){
	scanf("%d%d%llu%d",&n,&m,&seed,&w);
	scanf("%d",&q);
	for(int i=0;i<=n;++i)a[i]=rnd()%w;
	for(int i=0;i<=m;++i)b[i]=rnd()%w;
	sum[0]=b[0];
	for(int i=1;i<=n+m;i++) sum[i]=(1ll*sum[i-1]+b[i])%p;
	int l,r;
	for(int i=1;i<=q;++i){
		scanf("%d%d",&l,&r);
		printf("%lld\n",(gt(r)-gt(l-1)+p)%p);
	}
	return 0;
}
### 产品联合测试流程和注意事项 产品联合测试(简称“联测”)是软件开发过程中一个关键环节,特别是在个团队或模块协同开发的场景中。其主要目的是验证不同模块、系统或服务之间的接口是否能够正确交互,确保整体功能的完整性和稳定性。 #### 联测流程 1. **需求对齐与测试计划制定** 在联测开始前,各方需对产品需求、功能边界、接口规范进行明确,并制定详细的测试计划,包括测试范围、测试用例设计、测试环境准备、测试时间安排等。 2. **接口文档准备与评审** 各方需提供完整的接口文档,包括请求方式、参数说明、返回值格式、错误码定义等。通过文档评审确保接口设计合理且无歧义。 3. **测试环境搭建与接口联调** 搭建与生产环境尽可能一致的测试环境,进行接口联调。此阶段主要验证接口是否能正常通信,响应是否符合预期。 4. **执行测试用例与缺陷管理** 根据测试计划执行测试用例,记录测试结果。发现缺陷后需及时提交并跟踪修复情况,确保问题闭环。 5. **回归测试与验收确认** 缺陷修复后进行回归测试,验证问题是否彻底解决。最终由相关方确认测试结果,完成联测交付。 6. **联测总结与文档归档** 联测结束后进行总结,分析测试过程中的问题与经验,归档测试文档,为后续维护和升级提供依据。 #### 注意事项 - **接口一致性** 确保接口在开发与测试阶段保持一致性,避免因接口变更导致测试失败。如有变更,应及时同步文档并通知相关方。 - **数据隔离与安全性** 测试数据应与生产数据隔离,防止测试行为影响真实业务。同时需注意敏感数据的脱敏处理。 - **异常处理与容错机制** 需对接口异常情况进行测试,如超时、参数错误、服务不可用等,确保系统具备良好的容错能力。 - **日志与监控** 联测过程中应开启详细的日志记录,便于问题定位。建议引入监控工具,实时观察接口调用状态与性能。 - **沟通与协作机制** 联测涉及方协作,需建立高效的沟通机制,及时处理测试中发现的问题,避免因沟通不畅影响进度。 - **自动化测试支持** 建议在联测阶段引入自动化测试工具,提升测试效率与覆盖率,尤其适用于回归测试。 #### 示例:接口联测测试用例(伪代码) ```python def test_api_response(): # 请求参数 payload = { "user_id": 12345, "token": "abc123xyz" } # 发起请求 response = api_client.post("/user/profile", data=payload) # 验证响应状态码 assert response.status_code == 200 # 验证返回数据结构 assert "username" in response.json() assert "email" in response.json() # 验证错误处理 invalid_payload = {"user_id": None} error_response = api_client.post("/user/profile", data=invalid_payload) assert error_response.status_code == 400 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值