Solution

注意到$\gcd$具有结合律:

\[
\gcd(a, b, c) = \gcd(a, \gcd(b, c))
\]

因此我们从后往前, 对于每个位置$L$, 找到每一段不同的$\gcd(a_x, a_{x + 1}, \cdots, a_R)$. 我们注意到这样的$R$最多只有$\log$段.

每个位置合并其后面一个位置的信息.

同时我们还维护序列的前缀异或和, 对于每个异或值, 都开一颗线段树来存储其出现的位置. 随便乱搞即可.

#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#include <map> typedef long long LL;
using namespace std;
namespace Zeonfai
{
inline LL getLL()
{
LL a = 0, sgn = 1; char c;
while (! isdigit(c = getchar())) if (c == '-') sgn *= -1;
while (isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
const int N = (int)1e5, INF = (int)2e9;
int n;
LL a[N + 1], sum[N + 1];
struct record
{
int ed; LL val;
inline record(int _ed, LL _val) { ed = _ed; val = _val; }
};
vector<record> bck[N + 1];
map<LL, int> mp;
struct segmentTree
{
struct node
{
node *suc[2];
inline node() { for (int i = 0; i < 2; ++ i) suc[i] = NULL; }
}*rt;
inline segmentTree() { rt = NULL; }
node *insert(node *u, int L, int R, int pos)
{
if (u == NULL) u = new node;
if (L == R) return u;
if (pos <= L + R >> 1) u->suc[0] = insert(u->suc[0], L, L + R >> 1, pos);
else u->suc[1] = insert(u->suc[1], (L + R >> 1) + 1, R, pos);
return u;
}
inline void insert(int pos) { rt = insert(rt, 1, n, pos); }
int find(node *u, int curL, int curR, int L, int R)
{
if (u == NULL) return INF;
if (curL == curR) return curL;
int res = INF, mid = curL + curR >> 1;
if (L <= mid) res = min(res, find(u->suc[0], curL, mid, L, R));
if (res == INF && R > mid) res = min(res, find(u->suc[1], mid + 1, curR, L, R));
return res;
}
inline int find(int L, int R) { return find(rt, 1, n, L, R); }
}seg[N];
/* inline LL __gcd(LL a, LL b)
{
if (a < b) swap(a, b);
while (b)
{
LL tmp = b;
b = a % b;
a = tmp;
}
return a;
} */
inline vector<record>::iterator getPrevious(vector<record>::iterator p) { return -- p; }
int main()
{ #ifndef ONLINE_JUDGE freopen("start.in", "r", stdin);
freopen("start.out", "w", stdout); #endif using namespace Zeonfai;
n = getLL();
for (int i = 1; i <= n; ++ i) a[i] = getLL();
for (int i = n; i; -- i)
{
bck[i].push_back(record(i, a[i])); int tot = 1;
if (i != n)
{
for (vector<record>::iterator p = bck[i + 1].begin(); p != bck[i + 1].end(); ++ p)
if (__gcd(p->val, a[i]) != bck[i][tot - 1].val)
bck[i].push_back(record(p->ed, __gcd(a[i], p->val))), ++ tot;
else bck[i][tot - 1].ed = p->ed;
}
}
sum[0] = 0; mp.clear(); int tot = 0;
for (int i = 1; i <= n; ++ i)
{
sum[i] = sum[i - 1] ^ a[i];
if (mp.find(sum[i]) == mp.end()) mp[sum[i]] = tot ++;
seg[mp[sum[i]]].insert(i);
}
LL K = getLL();
for (int i = 1; i <= n; ++ i)
{
for (vector<record>::iterator p = bck[i].begin(); p != bck[i].end(); ++ p)
{
if (K % p->val) continue;
int res = INF;
if (mp.find(K / p->val ^ sum[i - 1]) != mp.end())
res = seg[mp[K / p->val ^ sum[i - 1]]].find(p == bck[i].begin() ? i : getPrevious(p)->ed + 1, p->ed);
if (res != INF)
{
printf("%d %d\n", i, res);
return 0;
}
}
}
puts("no solution");
}

NOI模拟题5 Problem A: 开场题的更多相关文章

  1. fzuoj Problem 2182 水题

    http://acm.fzu.edu.cn/problem.php?pid=2182 Problem 2182 水题 Accept: 188    Submit: 277Time Limit: 100 ...

  2. 【NOIP2017提高A组模拟9.7】JZOJ 计数题

    [NOIP2017提高A组模拟9.7]JZOJ 计数题 题目 Description Input Output Sample Input 5 2 2 3 4 5 Sample Output 8 6 D ...

  3. noip模拟9 达哥随单题

    T1.随 看题第一眼,就瞄到最下面 孙金宁教你学数学  ?????原根?目测神题,果断跳过. 最后打了个快速幂,愉快的收到了达哥送来的10分. 实际上这题暴力不难想,看到一个非常小的mod应该就能想到 ...

  4. 5.23 NOI 模拟

    $5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...

  5. 【2018.12.10】NOI模拟赛3

    题目 WZJ题解 大概就是全场就我写不过 $FFT$ 系列吧……自闭 T1 奶一口,下次再写不出这种 $NTT$ 裸题题目我就艹了自己 -_-||| 而且这跟我口胡的自创模拟题 $set1$ 的 $T ...

  6. LCT题单(自己的做题情况反馈)(转自Flash)

    LCT题单(自己的做题情况反馈)(转自Flash) 随时进Flash Hu的LCT看一发 也可以看一下我自己的风格的板子 开始 维护链信息(LCT上的平衡树操作) [X] 洛谷P3690 [模板]Li ...

  7. NOI模拟赛Day3

    终于A题啦鼓掌~开心~ 开考看完题后,觉得第二题很好捏(傻叉上线 搞到十一点准备弃疗了然后突然发现我会做第一题 于是瞎码了码,就去准备饭票了... 好了,停止扯淡(就我一个我妹子每天不说话好难受QAQ ...

  8. 经典算法题每日演练——第十七题 Dijkstra算法

    原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...

  9. 经典算法题每日演练——第十一题 Bitmap算法

    原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...

随机推荐

  1. 史上最全的MSSQL笔记

    http://www.cnblogs.com/gameworld/archive/2015/09/08/4790881.html

  2. Android开发环境安装经验

    前段时间在一个安装论坛上,下载了老罗的Android学习视频,看到第三节就卡住了。我这边Eclipse安装SDK总是不成功,报各种错误。断断续续好几天的摸索,终于弄明白了。 首先要安装ADT插件,也就 ...

  3. Pipenv 学习笔记

    个人笔记,胡言乱语.并不是什么教学向文章.. 前言 在学习了 Python.Java 后,会发现 Java 有很成熟的项目构建工具,以前是使用 xml 的 Maven,现在又出现了使用 groovy ...

  4. [转] linux中 参数命令 -- 和 - 的区别

    在 Linux 的 shell 中,我们把 - 和 -- 加上一个字符(字符串)叫做命令行参数. 主流的有下面几种风格Unix 风格参数 前面加单破折线 -BSD 风格参数 前面不加破折线GNU 风格 ...

  5. LFTP下载远程文件

    拓展阅读: https://linux.cn/article-5460-1.html

  6. 【转】ugui自制摇杆

    http://www.cnblogs.com/duyushuang/p/4457691.html 珍爱生命,远离插件. 以上8个字,好好理解. 反正我是这么觉得. 我说的是unity,不是魔兽世界. ...

  7. POJ 3255:Roadblocks(次短路)

    题目大意:求无向图的次短路. 分析: 在起点终点各求一次最短路,枚举边,通过该边的最短路为其权值加上到起点和终点最短路之和,找到最短但又比最短路长的路径. 代码: program block; typ ...

  8. Bajtman i Okrągły Robin

    Bajtman i Okrągły Robin 题目描述 你是一个保安,你发现有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i] ...

  9. 核苷酸(evolution)

    核苷酸(evolution) 题目描述 生物课是帕特里克最讨厌的课程,没有之一. 相比做一些无聊而又无趣的遗传题,他更喜欢其他所有的科目. 包括英语. 但是今天不同.他被一个关于RNA感染DNA的题目 ...

  10. 刷题总结——飞飞侠(bzoj2143 最短路)

    题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...