首页 > 其他分享 >小D的序列

小D的序列

时间:2022-10-13 08:11:06浏览次数:58  
标签:int vis 1ll ans 序列 mul

题目描述

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

输入格式

第一行输入两个数 n,p ,表示数组长度和模数。
第二行输入 n 个数,第 i 个数为 \(f'_{i-1}\)其中序列 \(f'\)是序列 $f $排序后的内容。

输出格式

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

解析

等比数列\(a ^ 0, a ^ 1,...,a ^{ n - 1}\)中\(a ^ 1\)一定在f序列中(因为a<mod),所以我们可以枚举f序列中的每一个数,假设他是a并且判断一下。注意判断时加上另一个条件:\(a' ^ {n(n-1)/2} = a ^0 * a ^ 1 *...*a ^ {n - 1}\)。

代码

#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

标签:int,vis,1ll,ans,序列,mul
From: https://www.cnblogs.com/YHxo/p/16786754.html

相关文章

  • PHP Phar反序列化学习
    PHPPhar反序列化学习PharPhar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件。它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句。默认开......
  • java反序列化漏洞及其检测
    1java反序列化简介java反序列化是近些年安全业界研究的重点领域之一,在ApacheCommonsCollections、JBoss、WebLogic等常见容器、库中均发现有该类漏洞,而且该类型漏洞容......
  • C#中使用Newtonsoft.Json序列化和反序列化自定义类对象
    C#中使用Newtonsoft.Json序列化和反序列化自定义类对象在C#中序列化和反序列化自定义的类对象是比较容易的,比如像下面的一个Customer类,privateclassCustomer{......
  • TZOJ 7871:维护序列 单链表应用(创建/查询/插入/删除)
    描述 给定一个长度为n的整数序列。现在有m个操作,操作分为三类,格式如下:(1)1i:询问序列中第i个元素的值,保证i小于等于当前序列长度。(2)2iv:在序列中第i个元素前加......
  • Python基础 - 序列结构
    对内置的常用数据结构,列表,字典,元组,集合的基本点看书整理.有序序列:列表、元组、字符串无序序列:字典、集合可变序列:列表、字典、集合不可变......
  • Java 序列化
    importjava.io.*;/***Java序列化*Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存......
  • C#获取电脑硬盘序列号
    //1.取得设备硬盘的物理序列号仅支持windows桌面程序(unity用不了)publicstaticList<string>GetSerialNumber(){List<st......
  • java求最大递增子序列算法
    求最大递增子序列:packagecom.test.algorithm;importjava.util.Arrays;/***CreatedbyAdministratoron2022/10/12.*/publicclassMaxIncrSub{/*......
  • Mysql查询结果添加序列号
    单表从0开始SELECT(@i:=@i+1)ASidFROMsys_regionn1,(SELECT@i:=-1)ASitLIMIT1000从1开始SELECT(@i:=@i+1)ASidFROMsys_regionn1,......
  • Arrow,一个更好用的Python时间序列处理库!
    本文大纲总有人问我,应该​​怎么学习​​​某个知识点?下面的大纲就是很好的证明了。不管学习什么,总结和对比是很有必要的,这就是我们说的逻辑。当你把某个知识点的​​学习逻......