题目链接:https://www.luogu.com.cn/problem/P3306
给出一个p,a,b,x1,t,有xi=axi−1+b
求一个最小的n使得xn=t
下标缩一下先变成x0会更好算一点,只考虑x0的贡献就是x0×an,这个比较好搞。
b的贡献的话,对于第i次加入的b贡献是an−i总共也就是b×∑n−1i=0ai
通项公式一下合起来就是
x0an+an−1a−1b=t
把an提到前面来就是
an=t(a−1)+bxa−x+b
后面那个是已知的,然后就是上BSGS就好了。
需要注意的是如果a=1就不能用通项公式了,得上exgcd来搞。
要特判的东西有点多就不多讲了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath>
#define ll long long
using namespace std;
ll T,p,a,b,x,t,ans;
map<ll,ll> v;
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%p;
x=x*x%p;b>>=1;
}
return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){
x=1;y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll z=x;x=y;y=z-a/b*y;
return d;
}
void works(ll a,ll b,ll p){
ll x,y;
ll d=exgcd(a,p,x,y);
if(b%d){
printf("-1\n");
return;
}
x*=b/d;y*=b/d;
printf("%lld\n",(x%(d*p)+d*p)%(d*p)+1);
}
ll work(ll a,ll b,ll p){
if(!a&&!b)return 1;
if(!a)return -2;
ll t=sqrt(p)+1;v.clear();
for(ll i=0,z=1;i<t;i++,z=z*a%p)
v[z*b%p]=i;
a=power(a,t);
if(b==1||!a)return 1;
else if(!a)return -2;
ll ans=1e18;
for(ll i=0,tmp=1;i<=t;i++,tmp=tmp*a%p){
ll j=(v.find(tmp)!=v.end())?v[tmp]:-1;
if(j>=0&&i*t-j>=0)ans=min(ans,i*t-j);
}
if(ans==1e18)return -2;
return ans;
}
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x,&t);
if(!a&&!t&&b){puts("-1");continue;}
if(x==t){puts("1");continue;}
if(a==1){
works(b,(t-x+p)%p,p);
continue;
}
t=(t*(a-1)+b)%p;x=(x*a-x+b+p)%p;
t=t*power(x,p-2)%p;t=(t+p)%p;
printf("%lld\n",work(a,t,p)+1);
}
return 0;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构