ZOJ 3772 Calculate the Function 解题报告

Vue3+uniapp开发必备:5分钟搞定unplugin-auto-import自动导入配置(附常见报错解决) 本文详细介绍了在Vue3+uniapp项目中配置unplugin-auto-import插件实现自动导入的方法。通过该配置,开发者无需手动导入ref、onLoad等常用API,可显著提升编码效率和团队协作规范性。文章提供了从安装、TypeScript集成到高级用法的完整指南,并附带了常见报错的解决方案。 阅读详情

原题:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235

题意:给定一个序列A,每次询问一组 L, R, 设 F(L) = AL, F(L+1) = AL+1, F(x) = F(x-1) + F(x-2) * Ax, 求F(R)


解法1:线段树

对于形如f(x) = p * f(x-1) + q * f(x-2)的通项都可以转成矩阵乘法,对于本题就是


于是依次拓展后得到



对于线段树的每个结点保存一个矩阵,如果结点是叶子,则有 a[0][0] = a[1][0] = 1, a[0][1] = Ax, a[1][1] = 0的形式

否则保存 a[r] * a[r-1] * ... * a[l] 的结果矩阵,要注意不要乘反了


于是对于每一个询问 l, r, 答案就是 find(l + 2, r) 的结果矩阵,再去乘 Al+1 Al 矩阵的结果


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define eps 1e-8
#define MP make_pair
#define mxn 100005

LL A[mxn];
int ll[mxn << 2], rr[mxn << 2];

struct Matrix {
    LL a[2][2];
    Matrix(){}
    Matrix( int x ){
        a[0][0] = a[1][0] = 1;
        a[0][1] = x;
        a[1][1] = 0;
    }
}M[mxn << 2];

Matrix mul(Matrix A, Matrix B) {
    Matrix C;
    memset(C.a, 0, sizeof(C.a));
    for( int i = 0; i < 2; ++i )
        for( int j = 0; j < 2; ++j )
            for( int k = 0; k < 2; ++k )
                C.a[i][j] = (C.a[i][j] + A.a[i][k] * B.a[k][j]) % mod;
    return C;
}

void build( int l, int r, int i ) {
    ll[i] = l, rr[i] = r;
    if( l == r ) {
        M[i] = Matrix(A[l]);
        return ;
    }
    int m = (ll[i] + rr[i]) >> 1, ls = i << 1, rs = ls | 1;
    build(l, m, ls), build(m + 1, r, rs);
    M[i] = mul(M[rs], M[ls]);
}

Matrix find( int l, int r, int i ) {
    if( ll[i] == l && rr[i] == r ) return M[i];
    int m = (ll[i] + rr[i]) >> 1, ls = i << 1, rs = ls | 1;
    if( r <= m ) return find(l, r, ls);
    if( l  > m ) return find(l, r, rs);
    return mul(find(m + 1, r, rs), find(l, m, ls));
}

int main()
{
    //ios_base::sync_with_stdio(false);
    int t, n, m, l, r;
    cin >> t;
    while( t-- ) {
        cin >> n >> m;
        for( int i = 1; i <= n; ++i ) scanf( "%lld", A + i );
        build(1, n, 1);
        while( m-- ) {
            scanf( "%d%d", &l, &r );
            if( r - l <= 1 ) printf( "%lld\n", A[r] );
            else {
                Matrix C = find(l + 2, r, 1);
                LL ans = C.a[0][0] * A[l+1] % mod + C.a[0][1] * A[l] % mod;
                printf( "%lld\n", ans % mod );
            }
        }
    }
    return 0;
}


解法2:分块

比赛的时候智商结石了,可耻的分块了:D

假设序列从F1开始,由于F(x) = F(x-1) + F(x-2) * Ax ,可知 F1 和 F2 永远不会乘在同一个多项式内

故设 F(x) = B(x) + C(x), 其中B(x)为含有F1的多项式之和,C(x)为含有F2的多项式之和

于是我们把序列分成长为300的段,每段令F1 = F2 = 1,序列的第1个数做为F3,依次推到后面

那么对于一组确定的F1, F2, 我们有 F(x) = B(x) * F1 + C(x) * F2

当询问区间长度小于300时,可以直接撸,大于300时,先找到第一个大于l + 1的段,然后从Fl推到这个段的前面

由于我们把每段的头做为F3, 所以上一段的最后两个数,就是这一段的 F1, F2,代入即可


代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <cmath>
using namespace std;

#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define eps 1e-8
#define MP make_pair
#define mxn 110005

LL A[mxn], B[mxn], C[mxn], F[mxn];

void init( int n ) {
    for( int i = 1; i <= n; i += 300 ) {
        B[i] = A[i]; C[i] = 1;
        B[i+1] = A[i]; C[i+1] = A[i+1] + 1;
        for( int j = i + 2; j < i + 300; ++j ) {
            B[j] = (B[j-1] + B[j-2] * A[j]) % mod;
            C[j] = (C[j-1] + C[j-2] * A[j]) % mod;
        }
    }
}

int main()
{
    //ios_base::sync_with_stdio(false);
    int t, n, m, l, r;
    cin >> t;
    while( t-- ) {
        cin >> n >> m;
        for( int i = 1; i <= n; ++i ) scanf( "%lld", A + i );
        init(n);
        while( m-- ) {
            scanf( "%d%d", &l, &r );
            if( r - l <= 350 ) {
                F[l] = A[l];
                F[l+1] = A[l+1];
                for( int i = l + 2; i <= r; ++i )
                    F[i] = (F[i-1] + F[i-2] * A[i]) % mod;
                printf( "%lld\n", F[r] );
                continue;
            }
            int k = 1;
            while( k <= l + 1 ) k += 300;
            F[l] = A[l]; F[l+1] = A[l+1];
            for( int i = l + 2; i < k; ++i )
                F[i] = (F[i-1] + F[i-2] * A[i]) % mod;
            for( int i = k, j; ; i = j ) {
                j = i + 300;
                if( j <= r ) {
                    F[j-2] = (B[j-2] * F[i-2] % mod + C[j-2] * F[i-1] % mod) % mod;
                    F[j-1] = (B[j-1] * F[i-2] % mod + C[j-1] * F[i-1] % mod) % mod;
                }
                else {
                    F[r] = (B[r] * F[i-2] % mod + C[r] * F[i-1] % mod) % mod;
                    printf( "%lld\n", F[r] );
                    break;
                }
            }
        }
    }
    return 0;
}


STM32驱动HC-SR04超声波模块 本篇文章将带大家使用HAL库驱动HC-SR04超声波模块。超声波模块作为智能小车必备的模块,要学习智能小车的同学是必须掌握好这个模块的使用的。HC-SR04是一种常用的超声波传感器模块,也被称为超声波测距模块,广泛应用于各种自动化控制和测距系统中。它通常由超声波发射器、接收器、控制电路和外壳组成,可以实现非接触式的距离测量。下面是HC-SR04超声波模块的一些特性和技术参数:距离测量范围:2cm ~ 400cm(可调)。测量精度:0.3cm。工作电压:DC 5V。工作电流:15mA。 阅读详情

相关推荐

电力电子技术速通复习

一种完全纯净,结构完整的半导体晶体,其含有两种载流子而且,自由电子的浓度和空穴的浓度总是相等,一般情况下,在硅晶体中掺入P(磷)五价元素,多子为自由电子,少子为空穴;在硅晶体中掺入B(磷)三价元素,多子为空穴,少子为自由电子;6.PN结具有单相导电性,PN结具有雪崩击穿(T越高,击穿电压越大)和齐纳击穿(T越高,击穿电压越小),均可逆,热击穿不可逆;PN结具有电容效应,势垒电容(耗尽层变化等效的电容)扩散电容(非平衡少子引起的电荷量的变化等效出来的电容效应)

qq_62873973的博客 2506

ZOJ 3772 Calculate the Function

题目链接 的

Dewey's blog 1356

sap销售发货的流程_SAP销售订单发货后如何实现发票的自动创建?

问SAP销售订单发货后如何实现发票的自动创建?答业务场景有些快消零售企业,SAP系统单据量大,单据金额少,一般在销售发货后即可确认收入。此时无需人工在系统内操作VF01或者VF04进行开票操作,可将该操作设置成后台作业进行自动批量开票,具体操作如下:1、定义任务:VF06输入完以上信息,点击保存进入以下界面:说明:当前日期的意思是“开票的日期”等于“系统电脑中的当前日期”当前日期+/-...

weixin_42358409的博客 3357

ZOJ 3772 Calculate the Function( 线段树 )

题意: 给一个序列An 有m个询问,每个询问包括l和r

yamiedie_ 1656

spoon工具的常用基础操作

先创建一个作业,这个作业流程,包括进行设置变量转换,查询结果输出转换,方便后续循环。整个流程写完后,执行作业5_执行整个流程,成功后,可以在数据库查看结果。,新建一个转换,excel表输入然后复制记录到结果,保存转换文件。这三个用户下 都有一张emp表 分别是 三个部门的用户信息。,新建一个数据库连接,变量命名用户名和密码。成功执行后,可以到保存的excel位置进行查看。emp表输入,可以进行预览查看数据有没有过来。输出到一直excel表,运行结果输出。,新建一个转换,拖拽。

qq_43583887的博客 5831

用友YonSuite产品实操手把手教学(图文版)

用友YonSuite

ct341688的博客 8154

zoj 3772 Calculate the Function

Calculate the Function Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a list of numbers A1 A2 .. AN and M queries. For the i-th query: The query has two parameters Li and R

qq243887的专栏 355

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1678

ZOJ 3772 Calculate the Function 【线段树维护矩阵乘法】

传送门:ZOJ 3772 Calculate the Function You are given a list of numbers A1 A2 … AN and M queries. For the i-th query: The query has two parameters Li and Ri. The query will define a function Fi(x) on...

Waiting For You 335

爆破shadow文件密码脚本(完成版)

由于添加了一个for循环,再稍作修改,让password not found!print(f"Trying password:")显示爆破的密码和过程。将代码中的password="123456"替换成下面代码。line.strip()函数首尾去空格。

m0_56578216的博客 771

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 121

ZOJ 3772 Calculate the Function [线段树+矩阵乘法]【思维?】

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3772 ———————————————————————————————————————————— Calculate the FunctionTime Limit: 2 Seconds Memory Limit: 65536 KB You are giv

Tabris的博客 790

27930-2015+充电协议解析

对2015+充电与2015充电进行硬件电路对比、通信协议对比和2015+通信协议解析。

manjixingkong1234的专栏 232

ZOJ - 3772 Calculate the Function 线段树

You are given a list of numbers A1 A2 … AN and M queries. For the i-th query: The query has two parameters Li and Ri. The query will define a function Fi(x) on the domain [Li, Ri] ∈ Z. Fi(Li) = ALi F...

突破吧!次元壁 202

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ZOJ 3772 Calculate the Function(线段树+矩阵乘法)

https://vjudge.net/contest/294593#problem/F 这道题是把相邻矩阵的乘积用线段树保存了,后面重复查询的时候节省了很多时间,其实难点在于问题的转化和矩阵乘法的模拟上,线段树方面用到的是很简单区间更新问题。 #include<iostream> #include<cstring> #include<cstdio> #i...

STOP 321

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

zoj3772 Calculate the Function 矩阵除法模板

终于将可逆矩阵的除法模板给

clasky的专栏 842

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

zoj 3772 Calculate the Function 线段树+矩阵

Time Limit: 2 Seconds Memory Limit: 65536 KB You are given a list of numbers A1 A2 .. AN and M queries. For the i-th query: The query has two parameters Li and Ri. The query will define a funct

ChasingWaves 630

ZOJ3772-Calculate the Function

Calculate the Function Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a list of numbers A1 A2 .. AN and M queries. For the i-th query: The query has two parameters Li and

wang_128的博客 392

Calculate the Function( ZOJ - 3772,线段树 + 递推矩阵乘积)

一.题目链接: ZOJ-3772 二.题目大意: 给 n 个数 a[1~n] 定义如下: 对于每次查询,给出区间端点和的值 求出. 三.分析: 由递推式可得 所以我们可以建一颗线段树,节点值存为矩阵,父节点就存为矩阵乘积. 然后进行区间查询即可. 查询得到的矩阵再乘以矩阵取(0,0)元素即可. 因为线段树的遍历顺序,所以...

The___Flash的博客 231

Calculate the Function ZOJ - 3772(线段树维护矩阵乘法)

题目链接: Calculate the Function ZOJ - 3772 题意: 给你一个区间 [L, R] ,再给你一个递推关系 f(L) = A[L] ; f(L+1) = A[L+1] ; f(x) = f(x - 1) + f(x - 2) * A[x] (x > 2) ,然后让你求 f(R)的值。 题解: 看到有递推式,首先想到矩阵快速幂,那么递推矩阵是什么呢?...

ltrbless的博客 521

ZOJ 3772 Calculate the Function(线段树 + 矩阵)

题目链接:ZOJ 3772 Calculate the Function 线段树 + 矩阵。

fobdddf的专栏 1279

zoj3772 Calculate the Function(矩阵+线段树)

题目链接 题意 :给出一个函数 在区间[L,R] F(x) = a[x]; F(x+1) = a[x+1] F(k) = F(k-1)+F(k-2)*a[k] {x+2<=k<=R} 解法:转换为矩阵 1 a[k] f(x-1) a 0 乘以 f(x-2) #include<bits/stdc++.h> using namespace st

qwesde 464

Calculate the Function ZOJ - 3772

点击打开链接 通过题目给的递推公式 可以的出其矩阵形式 然后就是求某一区间的矩阵乘积 线段树或者rmq都可以解 也可以只维护一个前缀积 然后求矩阵的逆 #include &lt;bits/stdc++.h&gt; using namespace std; #define ll long long #define M 1000000007 struct node { int l; ...

sunyutian1998的博客 235

zoj-3772-Calculate the Function-线段树+矩阵

之前板刷了很多的矩阵的题目。结果心中就有了一个很错误的想法。 就是矩阵的题目都是用来高次幂运算的。 今天看了这道题目,一开始感觉是矩阵,后来看看了,感觉不是矩阵,就放弃了。 后来放学的时候,SCF跟我说这道题目是线段树+矩阵。 我就又开始想了这道题目。 后来仔细想了想发现,原来是线段树预处理矩阵,然后每次询问O(log(n))。 又学到了一招,真棒 #include #includ

青竹梦 2460

[矩阵+线段树] zoj 3772 Calculate the Function

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235 Calculate the Function Time Limit: 2 Seconds      Memory Limit: 65536 KB You are given a list of numbers A1 A2 .. AN

cc_again的专栏 1110

ZOJ 3772 Calculate the Function (好题,线段树) ZOJ 1671

我想说,这个题真的很好很好。ganx

老李2009 1214
上一篇: ZOJ 3719 Diablo III 动态规划
下一篇: HDU 4833 Best Financing 一脸费用流的dp
916852
博客等级 码龄14年 30粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值