博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 3772 Calculate the Function 矩阵相乘+ 线段树查询
阅读量:6516 次
发布时间:2019-06-24

本文共 1910 字,大约阅读时间需要 6 分钟。

题目来源:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3772

 

分析:

公式来源:http://blog.csdn.net/u013491262/article/details/23089957#comments

 

代码如下:

const int Mod=1000000007;struct Mat{    LL a[2][2];    Mat(){        memset(a,0,sizeof(a));    }    Mat( LL a01)    {        a[0][0]=1;        a[0][1]=a01;        a[1][0]=1;        a[1][1]=0;    }    Mat operator *( Mat m){        Mat ans;        for(int i=0; i<2; i++){            for(int j=0; j<2 ;j++){                for(int k=0 ;k<2; k++){                    ans.a[i][j]=( ans.a[i][j] +  a[i][k]*m.a[k][j] ) % Mod;                }            }        }        return ans;    }};const int Max_N = 100008;Mat sum[Max_N <<2]; // 存的是区间点的矩阵连乘积LL x[Max_N];int N;void push_up(int root){    sum[root]=  sum[root<<1|1] * sum[root<<1];}void make_tree(int L, int R, int root){    if(L == R){        sum[root]=Mat(x[L]);        return;    }    int mid= (L + R)>>1;    make_tree(L, mid , root<<1);    make_tree(mid+1, R, root<<1|1);    push_up(root);}Mat query(int l, int r, int L, int R, int root){    if(l<=L && R <= r)        return sum[root];    int mid=(L + R)>>1;    if(mid >= r)        return query(l,r,L, mid, root<<1);    else if(mid < l)        return query(l,r,mid+1, R, root<<1|1);    else        return query(l,r,mid+1, R, root<<1|1) * query(l , r, L, mid, root<<1);}LL Ans(int L, int R){    if(L > R)        swap(L,R);    if(R==L || R==L+1)        return x[R] % Mod;    Mat m=query(L+2, R , 1,N,1);    return (m.a[0][0] * x[L+1] + m.a[0][1]* x[L]) % Mod;}int main(){    int t,m;    //cin>>t;    scanf("%d",&t);    while(t--){        //cin>>N>>m;        scanf("%d%d",&N,&m);        for(int i=1 ; i<=N ; i++)            scanf("%lld",&x[i]);        make_tree(1,N,1);        while(m--){            int l,r;            //cin>>l>>r;            scanf("%d%d",&l,&r);            //cout<
<

 

转载于:https://www.cnblogs.com/zn505119020/p/3656428.html

你可能感兴趣的文章
s:iterator巧妙控制跳出循环
查看>>
移动互联网思维
查看>>
redis-手写redis切片和非切片连接池并注入springboot中
查看>>
Kosaraju算法详解
查看>>
Serv-U 的升级及数据备份和迁移【转】
查看>>
webstorm无法显示左边文件夹目录的解决方法
查看>>
Android数据保存之文件保存
查看>>
数字校园-云资源平台 2014.10.26-人人通共享空间
查看>>
使用IIS承载WCF服务
查看>>
在 CentOS 和 RHEL 上安装 Puppet 服务器和客户端
查看>>
Android性能优化Google课程翻译一:Render----OverDraw实战
查看>>
用Camshift算法对指定目标进行跟踪
查看>>
Tiny4412 开发板 编译环境搭建【转】
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
Android studio及eclipse中的junit单元測试
查看>>
几个英文网站
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>