小D的序列

题目描述

小D今天学习了哈希,因此她对一个等比数列在模意义下的值产生了浓厚兴趣。她选定了三个数 n,a,p (0<a<p) ,并生成了一个共 n 项且下标从 0 开始的序列fi=aimodp 用于研究。但可惜的是,她不小心把 f 排序了一下,并且她忘记了原先的 a 的值,请你告诉她原先的 a 等于几。
注:题目描述中并没有包含部分限制条件,请仔细阅读限制与约定。

输入格式

第一行输入两个数 n,p ,表示数组长度和模数。
第二行输入 n 个数,第 i 个数为 fi1其中序列 f是序列 f排序后的内容。

输出格式

一行一个整数 a,表示原定的底数。

解析

等比数列a0,a1,...,an1a1一定在f序列中(因为a<mod),所以我们可以枚举f序列中的每一个数,假设他是a并且判断一下。注意判断时加上另一个条件:an(n1)/2=a0a1...an1

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10, inf = 1e9 + 10;
int n, p, a[N];
bool vis[N];
int qpow(int x, int k) {
int ans = 1;
while (k) {
if (k & 1) ans = 1ll * ans * x % p;
x = 1ll * x * x % p;
k >>= 1;
}
return ans;
}
bool check(int x) {
memset(vis, 0, sizeof vis);
for (int i = 1; i <= n; i ++) {
int v = qpow(x, i - 1);
int p = lower_bound(a + 1, a + n + 1, v) - a;
if (vis[p] == 1) return 0;
if (a[p] != v) return 0;
else vis[p] = 1;
}
return 1;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> p; int mul = 1;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
mul = 1ll * mul * a[i] % p;
}
int up = 1ll * n * (n - 1) / 2;
for (int i = 1; i <= n; i ++) {
if (qpow(a[i], up) == mul) {
if (check(a[i])) {
cout << a[i] << '\n';
return 0;
}
}
}
return 0;
}

image



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   YHXo  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示