首页 > 其他分享 >题解:ABC270G Sequence in mod P

题解:ABC270G Sequence in mod P

时间:2024-06-07 17:12:38浏览次数:8  
标签:frac Sequence int 题解 long read ans xn mod

题目传送门

思路

题目给出了一个数列

\[x_{i+1}\equiv {a\times x_i+b}\pmod{p} \]

并想要求最小的 \(x_i=G\),那我们可以考虑求出这个数列的通项公式。

具体的,观察到原式可以转化成一个等比数列的形式,所以我们可以先设一个常数 \(k\),使得

\[x_{i+1}+k=a(x_i+k) \]

替换进原先的式子

\[a(x_i+k)-k ax_i+b \]

\[ak-k=b \]

\[k=\frac{b}{a-1} \]

于是就有

\[x_{i+1}+\frac{b}{a-1}=a\left( x_i+\frac{b}{a-1} \right) \]

这样就把原式化成等比数列的形式了

\[x_{i+1}+\frac{b}{a-1}\equiv a\left( x_i+\frac{b}{a-1} \right) \pmod p \]

由等比数列的通项公式得

\[x_n+\frac{b}{a-1}\equiv a^{n}\times \left( x_0+\frac{b}{a-1} \right)\pmod p \]

题目是求 \(n\),移个项

\[a^{n}\equiv \frac{{x_n+\frac{b}{a-1}}}{x_0+\frac{b}{a-1}} \]

然后求下逆元就能 BSGS 了。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
inline int read();
int T;
long long p,a,b,x0,xn;
long long ksm(long long a,long long b,long long p)
{
	long long ans=1;
	while(b)
	{
		if(b&1) ans=(a*ans)%p;
		a=(a*a)%p;
		b>>=1;
	}
	return ans;
}
long long bsgs(long long a,long long b,long long p)
{
	map<int,int> ma;ma.clear();
	b%=p;
	int t=sqrt(p)+1;
	for(int i=0;i<=t;i++)
	{
		int val=b*ksm(a,i,p)%p;
		ma[val]=i;
	}
	a=ksm(a,t,p);
	for(int i=0;i<=t;i++)
	{
		int val=ksm(a,i,p);
		int j=ma.find(val)==ma.end()?-1:ma[val];
		if(j>0&&i*t-j>=0) return i*t-j;
	}
	return -1;
}
int main()
{
	T=read();
	while(T--)
	{
		p=read();a=read();b=read();x0=read();xn=read();
		if(x0==xn)
		{
			puts("0");
			continue;
		}
		if(a==0)
		{
			if(xn==b) puts("1");
			else puts("-1");
			continue;
		}
		if(a==1&&b==0)
		{
			puts("-1");
			continue;
		}
		if(a==1)
		{
			long long ans=((xn-x0)%p+p)%p*ksm(b,p-2,p)%p;
			printf("%lld\n",ans);
			continue;
		}
		long long inv=b%p*ksm(a-1,p-2,p)%p;
		long long b1=(xn%p+inv)%p;
		long long b2=ksm(x0%p+inv,p-2,p)%p;
		int ans=bsgs(a,b1*b2%p,p);
		printf("%d\n",ans);
	}
	return 0;
}

inline int read()
{
	int x=0,f=1;
	char ch;
	ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-') f=-f;ch=getchar();}
	while(ch<='9'&&ch>='0')
	{
		x=(x<<1)+(x<<3)+(ch&15);
		ch=getchar();
	}
    return x*f;
}

标签:frac,Sequence,int,题解,long,read,ans,xn,mod
From: https://www.cnblogs.com/yzxgg/p/18237528/solution-ABC270G

相关文章

  • Emacs Verilog Mode 简单使用指南
    引言在硬件描述语言(HDL)中,Verilog是一种广泛使用的语言,用于设计和描述数字电路。为了提高Verilog代码编写的效率和准确性,许多开发者选择使用Emacs作为他们的集成开发环境(IDE)。Emacs是一个高度可定制的文本编辑器,拥有丰富的插件生态系统,其中VerilogMode是专为Veril......
  • codeforces round 961题解(A、B、C)
    A.GuesstheMaximum因为\(i<j\),所以所有的\([i,j]\)区间中都至少包含两个相邻元素,所以只要求出所有相邻元素中较大值的最小值即可。intn;inta[N];voidsolve(){cin>>n;intmin_v=1e9+1;for(inti=1;i<=n;i++){cin>>a[i];......
  • 【已解决】Python报错Pytorch:ModuleNotFoundError: No module named ‘torch’
    本文摘要:本文已解决Pytorch:ModuleNotFoundError:Nomodulenamed‘torch’的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。......
  • 怎么发送超大文件?困扰已久的邮件大附件发送问题解决了!
    邮件是日常中使用最多的文件流转工具,特别是对于企业内部的员工间、及企业与企业间的业务开展,数据和文件的发送、业务留痕大多都基于邮箱展开。邮箱的普遍使用给用户基于邮箱进行业务沟通提供了前提,其中,Outlook邮箱是使用最广泛的邮箱之一。这使得邮箱成为一种最常用的通讯工具,但......
  • 智能仪表通过Modbus转Profinet网关与PLC通讯方案
    智能仪表通过Modbus转Profinet网关与PLC通讯方案一、功能及优势:Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持ModbusRTU主站/从站,并可以与RS485接口的设备,它自带网口......
  • BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and
    Motivation&Abs端到端大规模视觉语言预训练的开销极大。为此,本文提出了BLIP2,利用现成的冻住的imageencoder以及LLM引导视觉语言预训练。模态差距:通过两阶段训练的轻量级的QueryTransformer(Q-Former)弥补。第一阶段:从冻结的imageencoder引导VL学习;第二阶段:从冻结的LLM引导视......
  • 6月6日模拟赛题解
    P4315月下“毛景树”没代码能力,写不动,赛时没写。注意pushdown即可。#include<bits/stdc++.h>inlineintread(){ charch=getchar();intx=0,f=1; for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<......
  • Vue指令_v-bind&v-model
    VUE指令—v-bind及v-modelv-bind:为HTML标签绑定属性值,如设置href,css样式等。当vue对象中的数据模型发生变化时,标签的属性值会随之发生变化。v-model:在表单元素上创建双向数据绑定。vue对象的data属性中的数据变化,视图展示会一起变化;视图数据发生变化,vue对象的data属性......
  • arc179d 题解
    arc179d思路设计树形dp。\(dp_{u,0}\)表示进子树\(u\)并不再出去的代价。\(dp_{u,1}\)表示进子树\(u\)并返回,且传送门在\(fa\)、不在子树内使用传送门的代价。\(dp_{u,2}\)表示进入子树\(u\)并返回,且可以在子树内使用传送门。发现\(dp_{u,1}\)一定是遍历子树最后......
  • Modbus功能码
    Modbus是一种工业标准通信协议,它定义了一种让电子设备(如PLC、传感器、执行器等)之间进行数据交换的方式。Modbus协议支持多种通信介质,包括串行通信(RS-232、RS-485)和以太网TCP/IP。Modbus协议主要用于自动化控制系统和工业控制系统中,它有几个关键的功能码(FunctionCodes),用于执行......