zoukankan      html  css  js  c++  java
  • zoj 2671 Cryptography(矩阵+线段树)

    题意:给出n个2*2的矩阵,有m个查询,问某段区间的矩阵乘积。

    由于矩阵乘积符合结合律,故可用线段树来完成。

    View Code
     1 /*
     2 Author:Zhaofa Fang
     3 Lang:C++
     4 */
     5 #include <cstdio>
     6 #include <cstdlib>
     7 #include <iostream>
     8 #include <cmath>
     9 #include <cstring>
    10 #include <algorithm>
    11 #include <string>
    12 #include <vector>
    13 #include <queue>
    14 #include <stack>
    15 #include <map>
    16 #include <set>
    17 using namespace std;
    18 
    19 typedef long long ll;
    20 const int INF = 2147483647;
    21 
    22 /*
    23     a b
    24     c d
    25 */
    26 #define lson l , m , rt << 1
    27 #define rson m + 1 , r , rt << 1 | 1
    28 
    29 struct Ma
    30 {
    31     int a,b,c,d;
    32 }f[30005];
    33 
    34 int N,M,R;
    35 Ma product(Ma A,Ma B)
    36 {
    37     Ma ret;
    38     ret.a = (A.a*B.a+A.b*B.c)%R;
    39     ret.b = (A.a*B.b+A.b*B.d)%R;
    40     ret.c = (A.c*B.a+A.d*B.c)%R;
    41     ret.d = (A.c*B.b+A.d*B.d)%R;
    42     return ret;
    43 }
    44 Ma sum[30005<<2];
    45 void PushUp(int rt)
    46 {
    47     sum[rt] = product(sum[rt<<1],sum[rt<<1|1]);
    48 }
    49 void build(int l,int r,int rt)
    50 {
    51     if(l == r)
    52     {
    53         scanf("%d%d%d%d",&sum[rt].a,&sum[rt].b,&sum[rt].c,&sum[rt].d);
    54         return ;
    55     }
    56     int m = (l + r) >> 1;
    57     build(lson);
    58     build(rson);
    59     PushUp(rt);
    60 }
    61 Ma query(int L,int R,int l,int r,int rt)
    62 {
    63     if(L <= l && r <= R)
    64     {
    65         return sum[rt];
    66     }
    67     int m = (l + r) >> 1;
    68     Ma ret={1,0,0,1};
    69     if(L <= m)ret = product(ret,query(L,R,lson));
    70     if(m < R)ret = product(ret,query(L,R,rson));
    71     return ret;
    72 }
    73 int main()
    74 {
    75  //   freopen("in","r",stdin);
    76     bool flag=0;
    77     while(~scanf("%d%d%d",&R,&N,&M))
    78     {
    79         build(1,N,1);
    80         while(M--)
    81         {
    82             if(flag)puts("");
    83             else flag=1;
    84             int u,v;
    85             scanf("%d%d",&u,&v);
    86             Ma ret=query(u,v,1,N,1);
    87             printf("%d %d\n%d %d\n",ret.a,ret.b,ret.c,ret.d);
    88         }
    89     }
    90     return 0;
    91 }
    by Farmer
  • 相关阅读:
    segmentedControl设置字体和字体颜色问题
    iOS 8 自适应 Cell
    视频聊天 Demo
    tensorflow生成随机数的操作 tf.random_normal & tf.random_uniform & tf.truncated_normal & tf.random_shuffle
    python selenium点滴
    cmd 字符串截取
    cmd 获取 拖拽文件名
    cmd for 用法
    cmd dos bat 深度变量文件夹指定文件
    bat cmd dos 通过拖拽参数 上传 截取拖拽上传文件名
  • 原文地址:https://www.cnblogs.com/fzf123/p/2680872.html
Copyright © 2011-2022 走看看