链接:https://ac.nowcoder.com/acm/problem/20362
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小W喜欢读书,尤其喜欢读《约翰克里斯朵夫》。最近小W准备读一本新书,这本书一共有P页,页码范围为0⋯P−1。

小W很忙,所以每天只能读一页书。为了使事情有趣一些,他打算使用NOI2012上学习的线性同余法生成一个序列,来决定每天具体读哪一页。

我们用Xi来表示通过这种方法生成出来的第i个数,也即小W第i天会读哪一页。这个方法需要设置3个参数a,b,X1,满足0≤a,b,X1≤p−1,且a,b,X1都是整数。按照下面的公式生成出来一系列的整数:Xi+1≡aXi+b(mod p)其中mod表示取余操作。

但是这种方法可能导致某两天读的页码一样。

小W要读这本书的第t页,所以他想知道最早在哪一天能读到第t页,或者指出他永远不会读到第t页。

输入描述:

 

输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。

接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。

注意:P一定为质数

输出描述:

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

示例1

输入

复制

3
7  1 1 3 3
7  2 2 2 0
7  2 2 2 1

输出

复制

1
3
-1

题意:就是题目中给的那个式子能不能推出t来,如果能输出需要推导几次,不能输出-1

题解:

上代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <tr1/unordered_map>
using namespace std::tr1;
using namespace std;
typedef long long ll;
ll quick(ll a, ll b,ll c){ll ans=1;while(b){if(b&1) ans=(ans*a)%c;b>>=1;a=(a*a)%c;}return ans%c;
}
void exgcd(int a,int &x,int b,int &y){//ax+by=1if(!b){x=1;y=0;return ;}exgcd(b,y,a%b,x);y-=a/b*x;
}
int inverse(int x,int y){//x^(-1)(mod y) <=> x*x^(-1)+y*k=1int inv_x,k;exgcd(x,inv_x,y,k);return (inv_x%y+y)%y;
}
int BSGS(int a,int b,int c){//a^x=b(mod c)//特判答案<=100的情况for(int x=0,pow_a_x=1%c;x<=100;++x){if(pow_a_x==b)return x;pow_a_x=(long long)pow_a_x*a%c;}//通过预处理使得a,c互质int base_count=0,D=1;while(1){int d=__gcd(a,c);if(d==1)break;if(b%d)return -1;b/=d;c/=d;D=(long long)D*(a/d)%c;++base_count;}b=(long long)b*inverse(D,c)%c;//解a^(x-base_count)=b(mod c)int n=sqrt(c);unordered_map<int,int>hash_table;int pow_a_j=1;for (int j = 1; j <= n;++j){pow_a_j=(long long)pow_a_j*a%c;hash_table[(long long)pow_a_j*b%c]=j;}int pow_a_n=pow_a_j,pow_a_in=1,max_i=(c+n-1)/n;for (int i = 1; i <= max_i;++i){pow_a_in=(long long)pow_a_in*pow_a_n%c;if(hash_table.count(pow_a_in)) return i*n-hash_table[pow_a_in]+base_count;}return -1;
}
int main(){int T;scanf("%d",&T);while(T--){int p,a,b,x1,t;scanf("%d%d%d%d%d",&p,&a,&b,&x1,&t);if(x1==t){puts("1");continue;}if(a==0){if(b==t) puts("2");else puts("-1");}else if(a==1){t=(t-x1+p)%p;if(t%__gcd(b,p)) puts("-1");else printf("%d\n",(t*quick(b,p-2,p))%p+1);}else{int cao=((t+b*quick(a-1,p-2,p))%p*quick((x1+b*quick(a-1,p-2,p))%p,p-2,p))%p;int w=BSGS(a,cao,p)%p;if(w==-1) puts("-1");else printf("%d\n",w+1);}}return 0;
}

牛客——[SDOI2013]随机数生成器(推公式+BSGS)相关推荐

  1. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

  2. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

  3. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  4. bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)

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

  5. 【bzoj3122】 Sdoi2013—随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接) 题意 对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+ ...

  6. 数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

    [SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式,考虑化成等比数列 xi+1+k=a(xi+k)=a⋅xi+b+t ...

  7. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  8. 牛客竞赛每日俩题 - Day4

    14天阅读挑战赛 目录 模拟+辗转相除法 DP作图分析状态方程 找到只出现一次的字符: 模拟+辗转相除法 小易的升级之路_牛客题霸_牛客网 思路: 本题的能力值的累加分两种情况,一种是直接相加 bi, ...

  9. 华为云初体验——感谢牛客网与华为云联合送福利

    初闻 今天下午六点多,突然发现牛客网公众号推新了,顺手点了下,没想到牛客网搞活动,购华为云主机还返现!感动!正想买个服务器来搭个视频网站,真是福利,嘿嘿 行动 看到推文当然是赶紧下手啦!,详细步骤如下 ...

最新文章

  1. 右边菜单_Excel – 如何始终显示下拉菜单右边的小箭头?
  2. 自定义配置webpack打包文件
  3. maven web工程用MyEclipse Deploy后tomcat下无文件
  4. 总结之前做项目中要注意的一些书写规范
  5. 「3.4w字」超保姆级教程带你实现Promise的核心功能
  6. java循环单链表类构造函数_C++实现双向循环链表
  7. jQuery源码研究分析学习笔记-jQuery.deferred()(12)
  8. L2-013. 红色警报-PAT团体程序设计天梯赛GPLT(图的连通分量个数统计)
  9. try except python_Python的“异常”处理——try语句
  10. Python获取列表中字符串最长位置处的索引值
  11. 【红昭愿】MMD动作镜头下载
  12. 服务器自动访问iis,设置IIS服务器定时自动重启的方法以Windows Server 2008为例
  13. Android 联系人名字多音字的处理方法
  14. 研究意识问题为什么如此困难
  15. DOM算法系列002-寻找指定DOM节点的上一个或下一个节点
  16. PaddlePaddle飞桨论文复现营——3D Residual Networks for Action Recognition学习笔记
  17. 华为文件Android可以删吗,原来华为手机里这些文件夹都可以删!删完立马多出几个G!真棒...
  18. 指纹解锁亮屏时间 分析
  19. redis 哨兵模式踩坑
  20. Oracle数据库---JDBC连接

热门文章

  1. 【青松资讯】数字身份版真假美猴王——利用复制进行的金融犯罪
  2. 用Python实现远程控制电脑关机(啧啧啧)
  3. Java 分配员工部门源代码
  4. 网络子系统45_ip协议tos处理
  5. 腾讯云服务器安装什么系统,腾讯云服务器操作系统TencentOS安装与体验
  6. 2020网易计算机视觉算法实习电话面试
  7. Linux系统编程 / 分析开源软件Triggerhappy
  8. 计算机应用基础教学计划第二学期,计算机应用基础教学计划
  9. 阿里P8架构师深度概述分布式架构
  10. java+分割+汉字和英文_Java分割中英文,并且中文不能分割一半?