[bzoj3122][BSGS]随机数生成器

2023-10-16 03:38

本文主要是介绍[bzoj3122][BSGS]随机数生成器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

这里写图片描述

Input

输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。
接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。

注意:P一定为质数

Output

共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。

Sample Input

3

7 1 1 3 3

7 2 2 2 0

7 2 2 2 1

Sample Output

1

3

-1

HINT

0<=a<=P-1,0<=b<=P-1,2<=P<=10^9\

题解

讲个笑话
我居然连
等比数列
求和公式
都不知道
大言不惭扔一个上来

Sn=a1(1an)1a S n = a 1 ∗ ( 1 − a n ) 1 − a

其中a是公比
把柿子拆开
差不多是一个
anx1+an1b+an2b+...+b a n x 1 + a n − 1 b + a n − 2 b + . . . + b

把b提出来后面就是个等比数列..
因为不知道怎么O(1)求卡了半个小时的我你敢信
一通乱化简后大概是这样
an+1(x1b1a)+b1aT a n + 1 ( x 1 − b 1 − a ) + b 1 − a ≡ T

移项就是BSGS模板了..
然后
需要一些特判
a=0或者1的情况以及x1=0的情况..

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<map>
#define LL long long
using namespace std;
map<LL,int> q;
LL mod,a,b,x1,T;
LL pow_mod(LL a,LL b)
{LL ret=1;while(b){if(b&1)ret=ret*a%mod;a=a*a%mod;b>>=1;}return ret;
}
LL exgcd(LL a,LL b,LL &x,LL &y)
{if(a==0){x=0;y=1;return b;}else{LL tx,ty;LL d=exgcd(b%a,a,tx,ty);x=ty-(b/a)*tx;y=tx;return d;}
}
LL BSGS(int y,int z)
{if(y==0&&z==0){return 1;}  if(y==0&&z!=0){return -1;}q.clear();LL k=ceil(sqrt(mod)),tmp=1,p=pow_mod(y,mod-2);q[z]=k+1;for(int i=1;i<k;i++){tmp=(LL)tmp*p%mod;LL t=(LL)tmp*z%mod;if(q[t]==0)q[t]=i;}tmp=1;p=pow_mod(y,k);for(int i=0;i<k;i++){if(q[tmp]){if(q[tmp]==k+1)return i*k+1;else return i*k+q[tmp]+1;}tmp=(LL)tmp*p%mod;}return -1;
}
int main()
{
//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);int Q;scanf("%d",&Q);while(Q--){scanf("%lld%lld%lld%lld%lld",&mod,&a,&b,&x1,&T);if(x1==0){if(b==0){if(T==0)puts("1");else puts("-1");continue;}}if(a==0){if(x1==T)puts("1");else if(b==T)puts("2");else puts("-1");continue;}if(a==1){LL A=b,B=mod,x,y,K=T-x1;LL d=exgcd(A,B,x,y);if(K%d){puts("-1");continue;}x=(x*(K/d)%(B/d)+(B/d))%(B/d);if(x-(B/d)>=0)x-=(B/d);printf("%lld\n",x+1);continue;}T%=mod;LL gg=-b;gg=gg*pow_mod(a-1,mod-2)%mod;x1=(x1-gg+mod)%mod;T=(T-gg+mod)%mod;T=T*pow_mod(x1,mod-2)%mod;printf("%lld\n",BSGS(a,T));}return 0;
}

这篇关于[bzoj3122][BSGS]随机数生成器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218760

相关文章

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

纸牌函数生成器

此模板用来生成纸牌类的测试数据,本人手打,不合理或缀余的地方希望大神指出。 T=10000(测试数据组数), t (两摞相等的牌,每摞牌的数量); 每张牌用A,2~9,T,J,Q,K;表示牌面大小; 用S,H,C,D;表示花色。 共52张牌。 #include<stdio.h>#include<time.h>#include<stdlib.h>#include<string.

【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程酒吧一群美女车展模特大屏幕视频改字AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

[Python]生成器和yield关键字

生成器和yield关键字 1.生成器介绍: 概述: ​ 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式… 作用: ​ 降低资源消耗, 快速(批量)生成数据. 实现方式: ​ 1.推导式写法. my_generator = (i for i in range(5)) ​ 2.yield写法. def get_generator():for i

Mybatis自动生成器的使用方式

文章目录 编写generator配置文件配置maven插件第一种启动方式第二种启动方式 编写generator配置文件 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration

【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程豪车劳斯莱斯库里南中控改名软件AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 修改图片或文字 渲染出视频

【Python知识宝库】迭代器与生成器:高效处理大数据集

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、迭代器:逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器:按需生成数据的魔法1. 生成器的定义2. 创建生成器生成器函数生成器表达式 3. 生成器的优势 三、迭代器和生成器在处理