bsgs+求数列通项——bzoj3122(进阶指南模板该进)
/*
已知递推数列 F[i]=a*F[i-1]+b (%c)
解方程F[x]=t an+1 = b*an + c
an+1 + c/(b-1) = b(an + c/(b-1))
an+1 + c/(b-1) = b^(n-1) * (a1+c/(b-1)) 根据这个数列可得
F[x] = (F[1] + b/(a-1))*a^(x-1) - b/(a-1) = t; (F[1] + b/(a-1))*a^(x-1) = t+b/(a-1)
a^(x-1) = (t+b/(a-1)) / (F[1]+b/(a-1))
用逆元算出右边,再用bsgs算x即可
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll p,a,b,f1,t; ll Pow(ll a,ll b,ll p){
ll res=;
while(b){
if(b%)
res=res*a%p;
b>>=;a=a*a%p;
}
return res;
}
ll inv(ll x,ll p){
return Pow(x,p-,p);
} ll bsgs(ll a,ll b, ll p){
//用来求a^x=b, 令x=i*t-j,(a^t)^i = b*a^j
//先把右边的t个值存下来
map<ll,ll>hash;
hash.clear();
b%=p;
ll t=sqrt(p)+;
ll tmp=b;
for(ll j=;j<t;j++){
ll val=b*Pow(a,j,p)%p;
hash[val]=j;
} a=Pow(a,t,p);
if(a==)return b==?:-;
for(int i=;i<=t;i++){//这个地方把循环起点改为1
ll val=Pow(a,i,p);
int j=hash.find(val)==hash.end()?-:hash[val];
if(j>= && i*t-j>=)
return i*t-j;
}
return -;
}
//F[i]=a*F[i-1]+b (%c)
int main(){
int T;cin>>T;
while(T--){
cin>>p>>a>>b>>f1>>t;
if(f1==t){puts("");continue;}
if(a==){
if(t==b)puts("");
else puts("-1");
continue;
}
if(a==){
if(b==){puts("-1");continue;}
ll ans = (((t-f1)%p+p)%p*inv(b,p))%p;
cout<<ans+<<'\n';
continue;
} a%=p;b%=p;f1%=p;t%=p; ll tmp=b*inv(a-,p)%p;
t=(t+tmp)%p;
t=t*inv(f1+tmp,p)%p;
t=t*a%p; cout<<bsgs(a,t,p)<<'\n';
}
}
bsgs+求数列通项——bzoj3122(进阶指南模板该进)的更多相关文章
- MT【312】特征根法求数列通项
(2016清华自招领军计划37题改编) 设数列$\{a_n\}$满足$a_1=5,a_2=13,a_{n+2}=\dfrac{a^2_{n+1}+6^n}{a_n}$则下面不正确的是( )A ...
- C++模板进阶指南:SFINAE
C++模板进阶指南:SFINAE 空明流转(https://zhuanlan.zhihu.com/p/21314708) SFINAE可以说是C++模板进阶的门槛之一,如果选择一个论题来测试对C++模 ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- Weex入门与进阶指南
Weex入门与进阶指南 标签: WeexiOSNative 2016-07-08 18:22 59586人阅读 评论(8) 收藏 举报 本文章已收录于: iOS知识库 分类: iOS(87) 职 ...
- HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)
HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...
- 【读书笔记】读《高性能网站建设指南》及《高性能网站建设进阶指南:Web开发者性能优化最佳实践》
这两本书就一块儿搞了,大多数已经理解,简单做个标记.主要对自己不太了解的地方,做一些记录. 一.读<高性能网站建设指南> 0> 黄金性能法则:只有10%~20%的最终用户响应时间 ...
- POJ 2388 Who's in the Middle (快速选择算法:O(N)求数列第K大)
[题意]求数列中间项. ---这里可以扩展到数列第K项. 第一次做的时候直接排序水过了= =--这一次回头来学O(N)的快速选择算法. 快速选择算法基于快速排序的过程,每个阶段我们选择一个数为基准,并 ...
- HDOJ2009求数列的和
求数列的和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- 练习2 H题 - 求数列的和
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 数列的 ...
随机推荐
- 反编译字节码角度分析synchronized关键字的原理
1.synchronized介绍 synchronized是java关键字.JVM规范中,synchronized关键字用于在线程并发执行时,保证同一时刻,只有一个线程可以执行某个代码块或方法:同时还 ...
- memset函数及其用法,C语言memset函数详解
在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构.在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”. 每种类型的变量都有各自的 ...
- 佳佳的 Fibonacci
佳佳的 Fibonacci \(f_n=f_{n-1}+f_{n-2},f_1=f_2=1\),求\(f_1+2f_2+3f_3+...+nf_nmod\ m,1≤n,m≤2^{31}-1\). 解 ...
- Vue Router高级
路由组件传参 通过props解耦 const User = { props: ['id'], template: '<div>User {{ id }}</div>' } co ...
- [转]C# 动态调用 WebService
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- FFmpeg Download
https://ffmpeg.zeranoe.com/builds/
- delphi xe10 麦克风、摄像头操作
TakePhotoFromCameraAction1: TTakePhotoFromCameraAction; // 通过手机摄像头获取图片TakePhotoFromLibraryAction1: T ...
- ST表 (模板) 洛谷3865
题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1) 题目描述 给定一个长度为 N N 的数列,和 M M ...
- NX二次开发-NXOPEN更改工程图视图名字baseView1->SetName("LSY");
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...
- Spring-Security (学习记录二)--修改为自己的登录页面
目录 1.修改spring-security.xml配置文件 2.增加login.jsp页面 3.重启项目即可看到效果 1.修改spring-security.xml配置文件 <!-- auto ...