bzoj3122 [Sdoi2013]随机数生成器(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

分析:
刚刚学了数列,看到这道题就不那么难受了

X[i+1]=(aX[i]+b)mod p
X[i+1]+u=a(X[i]+u)
(a-1)u=b
u=b/(a-1)
X[i+1]+u=(X[1]+u)*a^i
a^i=(X[i+1]+u)/(X[1]+u) (mod p)
已知X[i+1]
实际上就是
x^i=z (mod p),求解最小i

最后答案就是i+1

然而这只适用于a!=1的情况

当a==1的时候
这就是一个等差数列了
X[i+1]=X[1]+b*i
X[i+1]-X[1]=b*i
设x=i,z=X[i+1]-X[1]
式子就可以化简成
b*i=z (mod p)
b*i+k*p=z
我们先用扩欧求解b*i+k*p=1
最后把答案*z+1就可以了

注意

如果z不是gcd(b,p)的倍数,那么无解

一开始我的算法是:
i=(X[i+1]-X[1])*inv(b)
但是这样秒WA,我觉得一概是无法判断无解导致的

注意:p一定为质数
这样求逆元就可以用费马小定理了

tip

注意特殊情况的特判
x1==t,ans=1
a==0&&b==t,ans=2
a==0&&b!=t,ans=-1

一直连WA,最后才发现是主程序的问题
一个输出后忘了回车!!!

这里写代码片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<cmath>
#define ll long longusing namespace std;map<ll,int> mp;
ll p,z,t,x1,a,b,x,y;ll gcd(ll a,ll b)
{ll r=a%b;while (r){a=b;b=r;r=a%b;}return b;
}ll KSM(ll a,ll b,ll p)
{a%=p;ll t=1;while (b){if (b&1)t=(t%p*a%p)%p;b>>=1;a=(a%p*a%p)%p;}return t%p;
}int bsgs(ll x,ll z,ll p)
{mp.clear();x%=p; z%=p;if (x==0&&z==0) return 2;if (x==0) return -1;ll m=(ll)ceil(sqrt((double)p)),now=1;mp[1]=m+1;for (int i=1;i<m;i++){now=(now%p*x%p)%p;if (!mp[now]) mp[now]=i;}ll inv=1,tmp=KSM(x,p-m-1,p);for (int k=0;k<m;k++){int i=mp[(z%p*inv%p)%p];if (i){if (i==m+1) i=0;return k*m+i+1;}inv=(inv%p*tmp%p)%p;}return -1;
}void exgcd(ll a,ll b)
{if (b==0){x=1; y=0;return;}else{exgcd(b,a%b);int tt=y;y=x-(a/b)*y;x=tt;}
}ll inv(ll a,ll p)
{return KSM(a,p-2,p);
}int main()
{int T;scanf("%d",&T);while (T--){scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);if (x1==t){printf("1\n");continue;} else if (a==0){if (b==t) printf("2\n");else printf("-1\n");continue;}else if (a==1)   //等差数列 {z=((t-x1)%p+p)%p;if (z%gcd(b,p)!=0){printf("-1\n");continue;}exgcd(b,p);x=(x%p*z%p)%p;printf("%lld\n",(x%p+p)%p+1);}else   //等比 {ll u=(b%p*inv(a-1,p)%p)%p;   //u=b/(a-1)t=(t%p+u%p)%p;  x1=(x1%p+u%p)%p;z=(t%p*inv(x1,p)%p)%p;   //(X[i+1]+u)/(X[1]+u)printf("%d\n",bsgs(a,z,p));}}return 0;
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673239.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边写 Javascript 代码边玩游戏 – WarriorJS

在 github 上看到这个有趣的项目 – WarriorJS &#xff0c;项目的内容写着 – 令人兴奋的程序设计和人工智慧游戏&#xff0c;Ok 我坦白我是看到人工智慧被这个专案所吸引&#xff0c;但是玩了两个关卡&#xff0c;还是不知道这个游戏跟人工智慧有什么关系&#xff0c;不过这个…

挑选合适自己的一门编程语言

2019独角兽企业重金招聘Python工程师标准>>> 导读想学编程的原因有很多&#xff0c;你也许是想要做一个程序&#xff0c;又或者你只是想投身于这个行业&#xff0c;所以&#xff0c;在选择你的第一门编程语言之前&#xff0c;问问你自己&#xff1a;你想要在哪里运行…

css 实现章节名称不换行,多余部分用 ... 代替

修改之前:修改之后: 代码: <p style "white-space: nowrap;text-overflow: ellipsis;overflow: hidden;"><? $d[name] ?></p> <i><? $d[pen_name] ?></i> <i><?phpforeach ($d[tags] as $t) {echo $t[tag_name];…

.NET 反向代理-YARP 部署Https(SSL)

相关文章&#xff1a;.NET 反向代理-YARP.NET 反向代理-YARP 根据域名转发分享一个基于Abp 和Yarp 开发的API网关项目使用 Yarp 做网关YARP&#xff08;Yet Another Reverse Proxy&#xff09;是使用 .NET 构建的高度可定制的反向代理C# 开源一个基于 yarp 的 API 网关 Demo&am…

shell脚本--cut命令

bash&shell系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 选项说明 cut命令将行按指定的分隔符分割成多列&#xff0c;它的弱点在于不好处理多个分隔符重复的情况&#xff0c;因此经常结合tr的压缩功能。 -b&#xff1a;按字节筛选&#xff…

12C RAC for ASM添加磁盘步骤

RHEL 7.2使用EMC Powerpath扩容2T磁盘空间&#xff0c;需要添加至以用12C RAC for ASM系统中。下面是具体步骤&#xff0c;主机人员告知扩容别名为data_center_16、data_center_17 1&#xff1a;linux 7 系统下添加映射存储LUN(无需重启)1>查看机器HBA卡信息--两个节点机器都…

Windows 下 Redis 的下载和安装

一 安装redis 1. 下载redis https://github.com/MicrosoftArchive/redis/releases 注: 如果上面网址下载不了, 就到这里下载 https://download.csdn.net/download/m_nanle_xiaobudiu/104370342. 解压压缩文件夹3. 运行redis服务端到此 , redis已经可以正常使用了,但是为了方便…

什么是行内块元素?

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道行内元素和块级元素&#xff0c;在实际开发中&#xff0c;经常会听到行内块元素&#xff0c;那么什么是行内块元素呢&#xff1f; 行内块元素实际就是把块元素以行的形式展现,保留了块元素可以设置的对应CSS属…

WPF-08 控件模板

模板是描述控件外观&#xff0c;WPF中每个控件都有一个默认的模板&#xff0c;你可以通过定义模板来重写控件可视化外观和行为&#xff0c;WPF中有两种常用的模板Control Template和Data TemplateControl Template控件模板定义了控件的可视化外观&#xff0c;所有的UI控件都有自…

玄学搜索\随稽化

正解又不会写&#xff0c;又懒得去想 只好每次考试大大暴力&#xff0c;维持一下生活了 ----------------------- P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有n个重物&#xff0c;每个重物系在一条足够长的绳子上。每条绳子自上而下穿过桌面上的洞&#xff0c;然后系在一起。…

第0次作业

问题1:你为什么选择计算机专业&#xff1f;你认为你的条件如何&#xff1f; 答:我平时比较喜欢研究一些自己认为神秘的东西&#xff0c;我认为计算机就是这样的神秘东西&#xff01;所以我选择这个专业&#xff01;我认为我自己可以学会计算机这个专业&#xff01;我对自己有信…

Nginx +Tomcat 实现动静态分离(转)

Nginx Tomcat 实现动静态分离 动静态分离就是Nginx处理客户端的请求的静态页面(html页面)或者图片&#xff0c;Tomcat处理客户端请求的动态页面&#xff08;jsp页面&#xff09;&#xff0c;因为Nginx处理的静态页面的效率高于Tomcat。 一&#xff0e;Nginx简介&#xff1a; Ng…

Beanstalked的初步了解和使用(包括利用beanstalkd 秒杀消息队列的实现)

一 Beanstalkd 是什么 Beanstalkd&#xff0c;一个高性能、轻量级的分布式内存队列系统二 Beanstalkd 特性 1. 优先级&#xff08;priority&#xff09; 注&#xff1a;优先级就意味 支持任务插队&#xff08;数字越小&#xff0c;优先级越高&#xff0c;0的优先级最高&#…

WPF效果第二百篇之再玩Gamma曲线

前面效果中使用比较low的方式实现了2.4的Gamma曲线;虽说后面加了点动画呈现效果,但也就是个过渡版;今天才基本符合需求的效果:1、还是基于WPF效果第一百七十八篇之贝塞尔曲线他来实现的:3个ListBox 3个LandmarkControl2、在LandmarkControl增加插点位事件View:LandmarkControl …

2018企业面试总汇(答案请自行搜罗) 新增19年阿里面题(反向拓展技术栈)

Java 1.多个线程同时读写&#xff0c;读线程的数量远远大于写线程&#xff0c;你认为应该如何解决并发的问题&#xff1f;你会选择加什么样的锁&#xff1f; 2.JAVA的AQS是否了了解&#xff0c;它是干嘛的&#xff1f; 3.除了synchronized关键字之外&#xff0c;你是怎么来保障…

skynet源码阅读5--协程调度模型

注&#xff1a;为方便理解&#xff0c;本文贴出的代码部分经过了缩减或展开&#xff0c;与实际skynet代码可能会有所出入。 作为一个skynet actor&#xff0c;在启动脚本被加载的过程中&#xff0c;总是要调用skynet.start和skynet.dispatch的&#xff0c;前者在skynet-os中…

ASP.NET Core GRPC 和 Dubbo 互通

一.前言Dubbo 是比较流行的服务治理框架&#xff0c;国内不少大厂都在使用。以前的 Dubbo 使用的是私有协议&#xff0c;采集用的 hessian 序列化&#xff0c;对于多语言生态来说是极度的不友好。现在 Dubbo 发布了新版本 v3&#xff0c;推出了基于 gRPC 的新协议 Triple&#…

详解C# 迭代器

[引用&#xff1a;https://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html] 迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子&#xff0c;他是一种简化对象间通讯的模式&#xff0c;也是一种非常容易理解和使用的模式。简单来说&#xff0c;迭代器模…

利用redis List队列简单实现秒杀 PHP代码实现

一 生产者producer部分 --------------------------------producer 部分注释------------------------------------------------------------ 用户在页面请求之后, 获取到用户uid , 跳转到这个加入队列的方法 (这里直接在producer中模拟了多个uid) 在方法内部判断redis队列长…

使用Filezilla 与 linux远程服务器传输文件时,设置默认打开编辑器

1. 点击编辑 2. 选择设置&#xff0c;点击文本编辑 3. 设置编辑器目录 4. 确定作用&#xff1a; 这样设置之后&#xff0c;可以实现在远程站点栏直接下载并使用phpstorm编辑的作用 正常需要下载之后&#xff0c;再去本地相应下载目录打开&#xff0c;然后再进行上传文件&#x…