HDU 5475 An easy problem 线段树_weixin_33720452的博客-程序员宅基地

技术标签: php  数据结构与算法  

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\n",query(1,Q,1));
        }
        else
        {
            updata(y , y , 1 , 1);
            long long cx = query(1,Q,1);
            printf("%I64d\n",cx);
            X = cx;
        }
    }
}


int main(int argc,char *argv[])
{
    int Case;
    scanf("%d",&Case);
    int cas=1;
    while(Case--)
    {
        initiaiton();
        printf("Case #%d:\n",cas++);
        solve();
    }
    return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33720452/article/details/85758506

智能推荐

.Net Core5.0 上传文件报错413 Request Entity Too Large_向钱冲!的博客-程序员宅基地

开发环境:.Net Core 5.0 + MVC 进行开发.Net Core5.0 上传文件报错413 Request Entity Too Large

K-means算法过程及使用实例_kmeans聚类算法实例_huobumingbai1234的博客-程序员宅基地

一、K-means算法主要过程   (1)从数据中选择k个对象作为初始聚类中心;  (2)计算每个聚类对象到聚类中心的距离来划分;  (3)再次计算每个聚类中心  (4)聚类中心不再变化或到最大迭代次数,则停止,否则,重复2、3。二、K-means算法手写公式化表示三、K-means算法适用范围适用于凸数据集,且数据集符合混合高斯分布,这也是由算法特性决...

KMP算法_中文kmp算法_转向者的博客-程序员宅基地

在文章里只给出了算法代码以及解释,后边的留下了一份中文一份英文的参考博文地址以便深刻理解KMP算法。ps:中文的亲测,解释原理简单易懂。KMP算法算法思想相比蛮力算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程。这个哈希表被叫做“部分匹配值表(**Particial match table**)”,它的设计是

Ogre渲染队列RenderQueue结构图_pizi0475的博客-程序员宅基地

渲染队列RenderQueue1. RenderQueue的组成RenderQueue由Ogre::RenderQueueGroup组成的,RenderQueue中有一个RenderQueueGroup的Map的数据成员:typedef std::map RenderQueueGroupMapRenderQueueGroupMap mGroups可见RenderQueueGroupMap 的key为RenderQueueGroupID,代表Objects的渲染先后顺序。RenderQueueGroupID是

c语言程序设计实验与案例周信东实验四,桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf..._樱桃小公举的博客-程序员宅基地

桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf成绩良评语继续努力.批改时间2013-11-16 105155批改老师 实验实验 2 2顺序结构与逻辑运算顺序结构与逻辑运算 学号姓名实验日期2013-10-30 1. 实验目的和要求实验目的和要求 (1)掌握数据输入/输出函数的使用,能正确使用各种格式转换符。 (2)熟悉顺序结构程序中语句的执行过程,并学会基本调试程序方法...

随便推点

【数据结构】实验项目:顺序表,也就那么回事_数据结构实验_MAX在码字的博客-程序员宅基地

目录序嗨,这里是狐狸~~简介顺序表的结构定义:声明顺序表类型变量:实验内容:实验说明 :实验思路1、输入一组整型元素序列(不少于10个),建立顺序表。2. 在该顺序表中进行顺序查找某一元素,查找成功返回 1,否则返回 0。3.判断该顺序表中元素是否对称,对称返回 1,否则返回 0。 symmetry.h4. 实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。5. 输入整型元素序列(不少于10个),利用有序表插入算法...

MDK4编译过程中出现的错误以及警告解释_博文天下-lei的博客-程序员宅基地

在做数据处理的时候,出现warning: #223-D: function &quot;abs&quot; declared implicitly添加:float abs(float __x);//防止abs warning, 原因不明确, 可能是math.h与stdlib.h中都有abs()吧,用stdlib.h替换math.h也可解决问题1.warning: #550-D: variable &quot;d&quot; was se...

VS.Net插件制作初级教程_dev_connect.cs_wxdl1981的博客-程序员宅基地

VS.Net插件制作初级教程作者:东方蜘蛛 2002年5月      

Stable-Diffusion和ControlNet插件安装全过程,以及使用心得汇总._张栖铭的博客-程序员宅基地

Stable-Diffusion和ControlNet插件安装全过程,以及使用心得汇总.

Win11搜索框恢复成放大镜_sagima_sdu的博客-程序员宅基地

上周更新了新版本的Win11,结果底部的搜索框真的丑到我了,要么整个删掉,要么就留着这根长条……