zoukankan      html  css  js  c++  java
  • HDU 5475 An easy problem 线段树

    An easy problem

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=5475

    Description

    One day, a useless calculator was being built by Kuros. Let's assume that number X is showed on the screen of calculator. At first, X = 1. This calculator only supports two types of operation.
    1. multiply X with a number.
    2. divide X with a number which was multiplied before.
    After each operation, please output the number X modulo M.

    Input

    The first line is an integer T(1≤T≤10), indicating the number of test cases.
    For each test case, the first line are two integers Q and M. Q is the number of operations and M is described above. (1≤Q≤105,1≤M≤109)
    The next Q lines, each line starts with an integer x indicating the type of operation.
    if x is 1, an integer y is given, indicating the number to multiply. (0<y≤109)
    if x is 2, an integer n is given. The calculator will divide the number which is multiplied in the nth operation. (the nth operation must be a type 1 operation.)

    It's guaranteed that in type 2 operation, there won't be two same n.

    Output

    For each test case, the first line, please output "Case #x:" and x is the id of the test cases starting from 1.
    Then Q lines follow, each line please output an answer showed by the calculator.

    Sample Input

    1
    10 1000000000
    1 2
    2 1
    1 2
    1 10
    2 3
    2 4
    1 6
    1 7
    1 12
    2 7

     

    Sample Output

    Case #1:
    2
    1
    2
    20
    10
    1
    6
    42
    504
    84

    HINT

    题意

    一开始ans = 1

    有两个操作

    1.乘以x

    2.除以第y个加入的数

    然后需要mod

    题解:

    显然,不用mod的话,就是傻逼题了

    但是有一个mod,那么我求逆元就好了

    但是很蛋疼的是,有些数并没有逆元怎么办?

    那就线段树咯……

    代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <stack>
    #include <map>
    #include <set>
    #include <queue>
    #include <iomanip>
    #include <string>
    #include <ctime>
    #include <list>
    #include <bitset>
    typedef unsigned char byte;
    #define pb push_back
    #define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
    #define local freopen("in.txt","r",stdin)
    #define pi acos(-1)
    
    using namespace std;
    const int maxn = 1e5 + 500;
    int Q;
    long long MOD,X,C[maxn];
    
    typedef long long SgTreeDataType;
    struct treenode
    {
      int L , R  ;
      SgTreeDataType sum ;
      void updata(SgTreeDataType v)
      {
          sum = v;
      }
    };
    
    treenode tree[maxn*4];
    inline void push_up(int o)
    {
        tree[o].sum = (tree[2*o].sum * tree[2*o+1].sum)%MOD;
    }
    
    inline void build_tree(int L , int R , int o)
    {
        tree[o].L = L , tree[o].R = R,tree[o].sum = 1LL;
        if (R > L)
        {
            int mid = (L+R) >> 1;
            build_tree(L,mid,o*2);
            build_tree(mid+1,R,o*2+1);
        }
    }
    
    inline void updata(int QL,int QR,SgTreeDataType v,int o)
    {
        int L = tree[o].L , R = tree[o].R;
        if (QL <= L && R <= QR) tree[o].updata(v);
        else
        {
            int mid = (L+R)>>1;
            if (QL <= mid) updata(QL,QR,v,o*2);
            if (QR >  mid) updata(QL,QR,v,o*2+1);
            push_up(o); 
        }
    }
    
    inline SgTreeDataType query(int QL,int QR,int o)
    {
        int L = tree[o].L , R = tree[o].R;
        if (QL <= L && R <= QR) return tree[o].sum;
        else
        {
            int mid = (L+R)>>1;
            SgTreeDataType res = 1LL;
            if (QL <= mid) res *= query(QL,QR,2*o);
            if(res >= MOD) res %= MOD;
            if (QR > mid) res *= query(QL,QR,2*o+1);
            if(res >= MOD) res %= MOD;
            return res;
        }
    }
    
    
    void initiaiton()
    {
        X=1;
        scanf("%d%I64d",&Q,&MOD);
        build_tree(1,Q,1);
    }
    
    void solve()
    {
        for(int i = 1 ; i <= Q ; ++ i)
        {
            int type ;
            long long y;
            scanf("%d%I64d",&type,&y);
            if(type == 1)
            {
                updata(i , i , y , 1);
                printf("%I64d
    ",query(1,Q,1));
            }
            else
            {
                updata(y , y , 1 , 1);
                long long cx = query(1,Q,1);
                printf("%I64d
    ",cx);
                X = cx;
            }
        }
    }
    
    
    int main(int argc,char *argv[])
    {
        int Case;
        scanf("%d",&Case);
        int cas=1;
        while(Case--)
        {
            initiaiton();
            printf("Case #%d:
    ",cas++);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    DOS命令,JDK安装,JAVA运行机制
    Typora学习
    我还能写我还能写
    博客展示
    测试报告
    【Alpha版本】冲刺阶段——Day 7
    【Alpha版本】冲刺阶段——Day 6
    【Alpha版本】冲刺阶段——Day 5
    【Alpha版本】冲刺阶段——Day 4
    【Alpha版本】冲刺阶段——Day 3
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4841359.html
Copyright © 2011-2022 走看看