P3306 [SDOI2013] 随机数生成器 题解

传送门

题解

思路

由题目中可知:

\[\large x_i \equiv ax_{i-1}+b\pmod{p} \]

可以得出:

\[\large t=x_{n+1} \equiv a^nx_1+b \sum_{i=0}^{n-1}a^i\pmod{p} \]

其中 \(n+1\) 即所求的天数。
对于后面的那部分,我们联想到平方差公式和立方差公式:

\[\large a^2-1=(a-1)(a+1) \\ a^3-1=(a-1)(a^2+a+1) \]

可以推广为:

\[\large a^n-1=(a-1)\sum_{i=0}^{n-1}a^i \]

于是,我们将上式两边同时乘以 \(a-1\)

\[\large (a-1)t\equiv (a-1)x_1a^n+b(a^n-1)\pmod{p} \]

观察到该式可以变形为 BSGS 的标准形式:

\[\large a^n\equiv[(a-1)t+b][(a-1)x_1+b]^{-1}\pmod{p} \]

这个式子看起来十分复杂,所以让我们换元,方便下文叙述。预备——换
\(c=(a-1)x_1+b\)\(d=(a-1)t+b\)
于是上式变为:

\[\large a^n\equiv c^{-1}d\pmod{p} \]

可以用 BSGS 求解。
注意求出来的 \(n\) 要加一。

细节

这是本题的重要部分。
首先,当 \(x_1=t\) 时,第一天就读到了第 \(t\) 页,直接输出 \(1\)
其次,当 \(a=0\) 时,从第二天开始每天都读第 \(b\) 页。如果 \(b=t\) 那么输出 \(2\),否则输出 \(-1\)
再其次,当 \(c\equiv0\pmod{p}\) 时,每天读的都是第 \(x_1\) 页。而既然能够走到这步,那么第一天就读不到第 \(t\) 页。因此输出 \(-1\)
最后,当 \(a=1\) 时,代入式子可得:

\[\large t\equiv x_1+bn\pmod{p} \]

使用 exgcd 求解。
关于求 \(c\) 的逆元,由于 \(p\) 是质数,且经过上述分类讨论,\(c\not\equiv0\pmod{p}\),因此 \(c\)\(p\) 一定互质。可以使用快速幂法和 exgcd 求解。
既然我们在讨论 \(a=1\) 时使用了 exgcd,那么使用 exgcd 更好。但是笔者一开始没讨论 \(\sout{a=1}\),所以用的快速幂。
为什么 markdown 的分割线对 \(\sout{\LaTeX}\) 不生效

实现

上面说得差不多了。注意中间量开long long

代码

快速幂和 exgcd:

int qpow(int x,int y,int p)
{int ret=1;while(y){if(y&1) ret=1ll*ret*x%p;x=1ll*x*x%p,y>>=1;}return ret;
}
int exgcd(int p,int q,int &x,int &y)
{if(!q){x=1,y=0;return p;}int ret=exgcd(q,p%q,y,x);y-=(p/q)*x;return ret;
}

BSGS:

std::unordered_map<int,int> mp;
int BSGS(int a,int s,int p)
{mp.clear();int len=ceil(sqrt(p)),tmp=1;for(int i=0;i<len;i++){mp[1ll*tmp*s%p]=i;tmp=1ll*tmp*a%p;}int base=1;for(int i=0;i<=len;i++){if(mp.find(base)!=mp.end())if(1ll*i*len-mp[base]>=0)return 1ll*i*len-mp[base];base=1ll*base*tmp%p;}return -2;		//因为要+1
}

注意多测。
主体部分:

int p,a,b,x,t;
scanf("%d%d%d%d%d",&p,&a,&b,&x,&t);
if(x==t)
{printf("1\n");continue;
}
if(a==0)
{printf("%d\n",b==t?2:-1);continue;
}
if(a==1)
{int tmp=t-x;int tx,ty;int gcd=exgcd(b,p,tx,ty);if(tmp%gcd)printf("-1\n");elseprintf("%d\n",(1ll*tx*tmp/gcd%p+p)%p+1);continue;
}
int c=(1ll*(a-1)*x+b)%p,d=(1ll*(a-1)*t+b)%p;
if(!c)
{printf("-1\n");continue;
}
d=1ll*d*qpow(c,p-2,p)%p;
printf("%d\n",BSGS(a,d,p)+1);

\[\Huge End \]

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

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

相关文章

WC 2025 游记

前情提要:CSP 运气好,苟进来了。然后 NOIP 爆炸,没去任何 THU/PKUWC。 Day 1 (1.17) 早上 5:30 起来往火车站跑,太幽默了。 到了就开始摆烂,胸牌只有一面有名字,另一面是“日程安排”。晚上是开幕式,唯一亮点是 dzd 讲话。上大学的时候,政治老师说:资本主义必然灭亡,…

RTE 社区 2024 总结:虽然「卷」,但可以和一群朋友一起,找到自己的速度丨RTE 开发者社区

「如果用一个词来总结你的 2024,将会是什么?」「卷。」「朋友。」「速度。」2025 年 1 月 4 日,小寒前夕,在北京甜水园的苟市和上海静安的 Solution,一群 Real-Time AI&Voice Agent Builder 加入了一场名为 「RTE Dev Party 2024o」的年度开发者聚会。席间觥筹交错,欢…

要成为客户的顾问、朋友、陪跑者

在销售领域,传统的 “推销” 模式正逐步被更为人性化、服务导向的理念所取代。出色的销售人员不再仅仅局限于销售产品,更重要的是身兼客户的顾问、朋友与陪跑者这三重角色。以下为您介绍如何在这三个角色间灵活转换,以此深化客户关系,提高销售业绩。 一、成为客户的顾问专业…

卡特兰数 Catalan

卡特兰数 定义 \(Catalan\) 数列 \(H_n\) 是以下问题的方案数:有一个大小为 \(n n\) 的方格图,左下角为 \((0, 0)\) 右上角为 \((n, n)\),从左下角开始 每次都只能向右或者向上走一单位,不走到对角线 \(y = x\) 上方(但可以触碰) 的情况下到达右上角有多少可能的路径? …

【vjudge训练记录】大一寒假专项训练——并查集

训练情况A题 并查集模板,求班级最多人数和班级数,可以使用map进行统计,取父节点塞进map里面,取最大值和size即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;const int N = 1e5 + 3;int fa[N];int n,m;int …

2024山西中考数学第15题

如图,在 $▱ABCD$ 中,$AC$ 为对角线,$AE⊥BC$ 于点 E,点 $F$ 是 $AE$ 延长线上一点,且 $∠ACF = ∠CAF$,线段 $AB$,$CF$ 的延长线交于点 $G$,若 $AB=\sqrt{5}$,$AC=4$,$\tan∠ABC=2$,则 $BG$ 的长为_________.解析 勾股定理+建系 过程 解:由题得,$AE=2$,$BE=1$。…

云--云计算设计模式

https://www.cloudpatterns.org/异常

CTS2025Day1T1 倾诉

以下定义 \(lim=\lceil\log a\rceil\)。 首先结构一定是形如将整个序列划分成若干子段,形如 \((l,r,p)\) 的结构,其中 \(p\ge r\),并且 \(p\) 严格单调递增,那么这一段的操作次数就是 \(p-l\),不妨令 \(f(l,r,p)\) 表示对应的权值。由于 \(a_n\ge 1\),所以说明最后一段的…

你希望 Windows 在你离开电脑多久后要求你重新登录? windows 11 家庭版 去掉登录开机密码

你希望 Windows 在你离开电脑多久后要求你重新登录? 你的电脑的电源设置阻止显示某些选项。windows 11 家庭版 去掉密码方法一、使用用户账户关闭登录密码 【不可行】1、点击“开始菜单”,在“搜索”框中输入“netplwiz”,并点击打开。2、在弹出的窗口中,选中需要更改的账户…

pig--apache

https://pig.apache.org/

Hugging Face 视觉语言小模型 SmolVLM 可在手机运行;OpenAI 推出智能体 Operator 联网执行任务

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

[CF1260D] A Game with Traps

A Game with Traps の 传送门首先,假设带 \(p\) 个人可以,那么带更少的人一定可以。 那么,可以二分带多少个人。 设当前二分带 \(x\) 个人。 带敏捷值最大的 \(x\) 个士兵肯定最好。 先去除当前无用的陷阱,即 \(d_i\) 小于等于 \(x\) 个士兵中的最小敏捷值。 陷阱区间不相交…