hdu5475 An easy problem(好题)
2015-09-26 18:44
239 查看
An easy problem
Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 113 Accepted Submission(s): 55
Problem 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
Source
2015 ACM/ICPC Asia Regional Shanghai Online
比赛的时候一直以为是求逆元,结果卡了几个小时,
题目就是建立一个简单的线段树,然后单点修改求区间
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long ll; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=155555; ll sum[maxn*4+4]; int add; int a[maxn]; int L,R; int MOD; int p; void pushup(int rt){ sum[rt]=sum[rt<<1]*sum[rt<<1|1]%MOD; } void build(int l,int r,int rt){ if(l==r){ sum[rt]=1; return ; } int m=(l+r)>>1; build(lson); build(rson); pushup(rt); } void update(int l,int r,int rt){ if(l==r){ sum[rt]=add; return ; } int m=(l+r)>>1; if(p<=m) update(lson); else update(rson); pushup(rt); } ll query(int l,int r,int rt){ ll ret=1; if(L<=l&&R>=r) return sum[rt]; int m=(l+r)>>1; if(L<=m) ret*=query(lson)%MOD; if(R>m) ret*=query(rson)%MOD; return ret%MOD; } int main() { int n,m; int op,u,q; int t; scanf("%d",&t); for(int case1=1;case1<=t;case1++){ printf("Case #%d:\n",case1); scanf("%d%d",&q,&MOD); build(1,q,1); for(int i=1;i<=q;i++){ scanf("%d%d",&op,&u); if(op==1){ p=i; add=u; update(1,q,1); L=1; R=i; printf("%I64d\n",query(1,q,1)%MOD); } else{ p=u; add=1; update(1,q,1); L=1; R=i; printf("%I64d\n",query(1,q,1)%MOD); } } } return 0; }
相关文章推荐
- 闰年的输出
- c语言 将字符串转化为整数
- Java 面向 对象之封装 、多态、继承 (2)
- OC-protocol
- Swift - 字符串(String)用法详解
- C++ Primer注意事项11_运算符重载_算术/关系运算符_下标运算符
- c语言 对8bit位数据的某位置1或 0
- PHP学习(五)--常量
- MAC安装并破解PhotoShop CC2014记录(附下载链接)
- 《活着》就是活着
- 滴滴出行2015年校招笔试题第一题
- 二叉树的深度
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
- ACdreamOJ 1154 Lowbit Sum (数字dp)
- Linux服务器搭建(以阿里云服务器为例)
- UVa 11795 Mega Man's Mission(集合动态规划)
- golang+litide+ubuntu环境配置
- 求两个数的公约数(gcd)
- DNS视图及日志系统
- 【从头开始学算法】快速排序