• 多校联测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
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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
    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
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    PHP使用阿里云对象存储oss
    docker-compose教程(安装,使用, 快速入门)
    刘二大人 PyTorch深度学习实践 笔记 P5 用PyTorch实现线性回归
    高教社杯数模竞赛特辑论文篇-2023年C题:基于历史数据的蔬菜类商品定价与补货决策模型(附获奖论文及R语言和Python代码实现)(下)
    Mac中使用virtualenv和virtualenvwrapper
    前端web自动化测试:selenium怎么实现关键字驱动
    Linux Centos7 下使用yum安装的nginx平滑升级
    AI伦理:科技发展中的人性之声
    智能制造之路—从0开始打造一套轻量级MOM平台之基础平台搭建(Linux部署)
    程序分析与优化 - 6 循环优化
  • 原文地址:https://blog.csdn.net/tanjunming2020/article/details/133656585