传送门

题解

思路

由题目中可知:

\[\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");
else
printf("%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
\]

P3306 [SDOI2013] 随机数生成器 题解的更多相关文章

  1. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

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

    思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...

  3. P3306 [SDOI2013]随机数生成器(bzoj3122)

    洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...

  4. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  5. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  6. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

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

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

  8. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  9. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

    题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...

  10. bzoj 3122 : [Sdoi2013]随机数生成器 BSGS

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

随机推荐

  1. Python 爬虫必备杀器,xpath 解析 HTML

    最近工作上写了个爬虫,要爬取国家标准网上的一些信息,这自然离不了 Python,而在解析 HTML 方面,xpath 则可当仁不让的成为兵器谱第一. 你可能之前听说或用过其它的解析方式,像 Beaut ...

  2. MySQL 8.0 为什么会放弃查询缓存?

    什么是查询缓存? 查询缓存就是将一次查询结果存储在内存中,假如下一次查询结果在内存中,就直接在内存中读取. 设计初衷 当然是提高性能,通过缓存来减少解析器.优化器.存储引擎的执行时间. MySQL查询 ...

  3. Vue.js 组件数据交互

    1.前言 本节讲述组件之间如何进行数据交互 2.props属性与非 prop 的属性 父组件通过属性绑定的形式传值给子组件,这种传值分2种 类别 含义 说明 props 子组件本身已经通过props定 ...

  4. canvas(五)绘制文本

    1.绘制描边文本 说明:描边的属性是共用的,无论是绘制直线还是文字,所以有需要的话要单独设置描边颜色,相关语法如下 语法 说明 ctx.strokeStyle 设置描边的颜色(文本颜色) ctx.fo ...

  5. VLC 播放完毕后自动退出的问题

    1.打开设置 2.打开全部显示 3.取消自动退出

  6. R数据分析:网状meta分析的理解与实操

    meta分析之前有给大家写过,但是meta分析只能比较两个方法.经常是被用来证明在现有研究中显示矛盾结果的干预方法到底有没有效的时候使用,通过证据综合得到某种干预到底有没有用的结论.但是如果我要证明好 ...

  7. NATS: 对象存储

    https://natsbyexample.com/examples/os/intro/dotnet2 NATS 中的对象存储能力是在 Stream 之上的一种抽象,它将消息的主题视为类似键值对中的键 ...

  8. 在 ASP.NET Core 中使用 Tailwind

    在 ASP.NET Core 中使用 Tailwind https://khalidabuhakmeh.com/install-tailwind-css-with-aspnet-core 表单和函数是 ...

  9. 【Python】【爬虫】【爬狼】002_自定义获取网页源码的函数

    在上一篇笔记([Python][爬虫系列][爬狼]001_urllib_get_获取响应结果页面代码 - 萌狼蓝天 - 博客园 (cnblogs.com/mllt))我们将一个网页,解析为了文档(源码 ...

  10. 证书签名算法OID.1.2.156.10197.1.501

    证书签名算法OID.1.2.156.10197.1.501   证书签名算法OID为1.2.156.10197.1.501表示该证书使用的是基于SM3的SM2签名算法 1.SM2证书数据和RSA算法证 ...