【HDOJ】3071 Gcd & Lcm game
刚开始看这个题目,觉得没法做。关键点是数据小于100。因此,可以枚举所有小于100的素因子进行位压缩。
gcd就是求最小值,lcm就是求最大值。c++有时候超时,g++800ms。线段树可解。
/* 3071 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
#define ui32 unsigned int typedef struct {
ui32 mx, mn;
} node_t; int factor[] = {,,,,,,,,,,,,,,,,,,,,,,,,};
int width[] = {,,,,,,,,,,,,,,,,,,,,,,,,};
int shift[] = {,,,,,,,,,,,,,,, , , , , , , , , , };
int mask[] = {,,,,,,,,,,,,,,,,,,,,,,,,};
const int maxn = 1e5+;
int M[][];
node_t nd[maxn<<];
int L, R, mod; void init() {
rep(i, , ) {
M[i][] = ;
rep(j, , mask[i]+)
M[i][j] = M[i][j-] * factor[i];
}
} int getVal(int x) {
int ret = , tmp; for (int i=; i>=; --i) {
tmp = M[i][x&mask[i]];
ret = ret * tmp % mod;
x >>= width[i];
} return ret;
} ui32 calc(int x) {
ui32 ret = , tmp; rep(i, , ) {
ret <<= width[i];
tmp = ;
if (x%factor[i] == ) {
while (x%factor[i] == ) {
++tmp;
x /= factor[i];
}
}
ret += tmp;
} return ret;
} ui32 mymax(ui32 x, ui32 y) {
ui32 ret = max(x&0x70000000, y&0x70000000)\
| max(x&0x0e000000, y&0x0e000000)\
| max(x&0x01800000, y&0x01800000)\
| max(x&0x00600000, y&0x00600000)\
| ((x&0x001fffff) | (y&0x001fffff));
return ret;
} ui32 mymin(ui32 x, ui32 y) {
ui32 ret = min(x&0x70000000, y&0x70000000)\
| min(x&0x0e000000, y&0x0e000000)\
| min(x&0x01800000, y&0x01800000)\
| min(x&0x00600000, y&0x00600000)\
| ((x&0x001fffff) & (y&0x001fffff));
return ret;
} inline void PushUp(int rt) {
int lb = rt << ;
int rb = lb | ; nd[rt].mx = mymax(nd[lb].mx, nd[rb].mx);
nd[rt].mn = mymin(nd[lb].mn, nd[rb].mn);
} void Build(int l, int r, int rt) {
if (l == r) {
int x;
scanf("%d", &x);
nd[rt].mx = nd[rt].mn = calc(x);
return ;
} int mid = (l + r) >> ; Build(lson);
Build(rson);
PushUp(rt);
} ui32 Query_mx(int l, int r, int rt) {
if (L<=l && R>=r) {
return nd[rt].mx;
} int mid = (l + r) >> ;
ui32 ret; if (R <= mid) {
ret = Query_mx(lson);
} else if (L > mid) {
ret = Query_mx(rson);
} else {
ui32 ltmp = Query_mx(lson);
ui32 rtmp = Query_mx(rson);
ret = mymax(ltmp, rtmp);
} return ret;
} ui32 Query_mn(int l, int r, int rt) {
if (L<=l && R>=r) {
return nd[rt].mn;
} int mid = (l + r) >> ;
ui32 ret; if (R <= mid) {
ret = Query_mn(lson);
} else if (L > mid) {
ret = Query_mn(rson);
} else {
ui32 ltmp = Query_mn(lson);
ui32 rtmp = Query_mn(rson);
ret = mymin(ltmp, rtmp);
} return ret;
} void Update(int k, int x, int l, int r, int rt) {
if (l == r) {
nd[rt].mx = nd[rt].mn = calc(x);
return ;
} int mid = (l + r) >> ; if (k <= mid)
Update(k, x, lson);
else
Update(k, x, rson); PushUp(rt);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int n, q;
char op[];
int tmp, k;
int ans; init();
while (scanf("%d %d", &n, &q) != EOF) {
Build(, n, );
while (q--) {
scanf("%s", op);
if (op[] == 'L') {
scanf("%d %d %d", &L, &R, &mod);
tmp = Query_mx(, n, );
ans = getVal(tmp);
printf("%d\n", ans);
} else if (op[] == 'G') {
scanf("%d %d %d", &L, &R, &mod);
tmp = Query_mn(, n, );
ans = getVal(tmp);
printf("%d\n", ans);
} else {
scanf("%d %d", &k, &tmp);
Update(k, tmp, , n, );
}
}
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】3071 Gcd & Lcm game的更多相关文章
- 【Pollard-rho算法】【DFS】poj2429 GCD & LCM Inverse
题意:给你一两个数m和n,它们分别是某对数A,B的gcd和lcm,让你求出一对使得A+B最小的A,B. n/m的所有质因子中,一定有一部分是只在A中的,另一部分是只在B中的. 于是对n/m质因子分解后 ...
- 【HDOJ】1695 GCD
莫比乌斯反演简单题目. /* 1695 */ #include <iostream> #include <string> #include <map> #inclu ...
- 【51NOD-0】1012 最小公倍数LCM
[算法]欧几里德算法 #include<cstdio> int gcd(int a,int b) {?a:gcd(b,a%b);} int main() { int a,b; scanf( ...
- 【精】iOS GCD 具体解释
一.介绍 1.什么是GCD? Grand Central Dispatch.是苹果公司开发的一套多核编程的底层API. GCD首次公布在Mac OS X 10.6,iOS4及以上也可用.GCD存在于l ...
- 【51nod】2026 Gcd and Lcm
题解 话说LOJ说我今天宜学数论= =看到小迪学了杜教筛去蹭了一波小迪做的题 标解的杜教筛的函数不懂啊,怎么推的毫无思路= = 所以写了个复杂度稍微高一点的?? 首先,我们发现f是个积性函数,那么我们 ...
- 【HDOJ】4983 Goffi and GCD
题意说的非常清楚,即求满足gcd(n-a, n)*gcd(n-b, n) = n^k的(a, b)的不同对数.显然gcd(n-a, n)<=n, gcd(n-b, n)<=n.因此当n不为 ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【数论】二进制GCD
二进制GCD GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...
- 【转】UVALive 5964 LCM Extreme --欧拉函数
题目大意:求lcm(1,2)+lcm(1,3)+lcm(2,3)+....+lcm(1,n)+....+lcm(n-2,n)+lcm(n-1,n)解法:设sum(n)为sum(lcm(i,j))(1& ...
随机推荐
- iOS开发——极光推送
1.到极光官网 https://www.jpush.cn/ 下载极光推送SDK. 具体如何集成最好参考官网的文档,以及一些失败的原因.文档非常详细,我也是参考集成的. 2.到极光推送官网注册自己的应用 ...
- 文件上传~Uploadify上传控件
对于文件上传来说,有很多种实现方式,如传统的表单方式,现在流行的flash方式,甚至还有纯JS方式,之所以有这些方式来实现文件上传,我想主要原因是因为,传统的上传对于大文件支持不够,因为它是单线程同步 ...
- 03静态链表_StaticLinkList--(线性表)
#include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...
- Python Numpy
ebook on quant trading /量子交易 參考: Python在Windows下的安裝可以使用Python(x,y).
- 以boost::function和boost:bind取代虚函数
转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...
- 九度OJ 1104 整除问题
题目地址:http://ac.jobdu.com/problem.php?pid=1104 题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2 ...
- 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题
题目地址:http://ac.jobdu.com/problem.php?pid=1504 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如 ...
- Android - 安装 windows 7 安装 Android SDK 的时候出现的问题!(Connection to https://dl-ssl.google.com refused)
Android - 安装 windows 7 安装 Android SDK 的时候出现的问题! 首先看到 Connection to https://dl-ssl.google.com refuse ...
- mysql---整体备份和增量备份
整体备份: 对整张表或者整个数据库甚至所有数据库进行备份. 增量备份: 对某一范围内的数据进行备份. 1.整体备份: 对表进行备份: 针对存储引擎为myisam的表,可以直接复制frm.myd.myi ...
- django分页工具
from django.core.paginator import Paginator 此对象可以进行分页操作 objects = Entry.objects.all() page = Paginat ...