3.10
昨天放假回去得知我对象给我买了一个重云的吧唧,真的好可爱啊🥵🥵🥵
TA不会是从广东寄过来的吧,感动了。
说是给我的生日礼物,还有20天我才生日啊🤔🤔🤔
如果以后在亨氏看到一个戴着重云吧唧的初中生那就是我了因为整个亨氏初中除了我没有推重云的🤣🤣😂
挺感动的,毕竟上了初中以后第一次有人送我生日礼物,而且还是网络上的朋友,真的感动了😭😭😭
jjdw经常在闲话里放一些好图,所以我找了一些烂图
- BSGS((Baby Step,Giant Step)
用于处理 \(b^x \equiv a \pmod p\) 给定 \(a\),\(b\),\(p\) 求最小的非负整数 \(x\)。复杂度 \(O(\sqrt p )\),可以处理 \(1e18\) 以内。
更大的数需用 Pohlig-Hellman 算法(可是我并不知道这是个什么东西)
P3846 [TJOI2007] 可爱的质数/【模板】BSGS
模板题
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int a,b,p;
inline int power(int a,int b,int p)
{
if(b==0)
return 1%p;
int ans=1,t=a;
while(b>0)
{
if(b%2==1) ans=ans*t%p;
b/=2;
t=t*t%p;
}
return ans;
}
inline int bsgs(int a,int b,int p)
{
map<int,int> hash;
hash.clear();
b%=p;
int t=sqrt(p)+1;
for(register int i=0;i<t;++i)
hash[(long long)b*power(a,i,p)%p]=i;
a=power(a,t,p);
if(!a) return b==0 ? 1:-1;
for(register int i=1;i<=t;++i)
{
int val=power(a,i,p);
int j=hash.find(val)==hash.end() ? -1:hash[val];
if(j>=0 && i*t-j>=0) return i*t-j;
}
return -1;
}
signed main()
{
cin>>p>>a>>b;
int ans=bsgs(a,b,p);
if(ans==-1) cout<<"no solution";
else cout<<ans;
}
随机数生成器
需要推几步式子
求\(X_{i+1} \equiv aX_i+b\pmod p\)
化为等比数列
\[X_{i+1}+\frac b{a-1} \equiv a(X_i+ \frac b{a-1})\pmod p
\]
根据等比数列递推公式得到
\[X_n+\frac{b}{a-1} \equiv a^{n-1}(X_i+\frac b{a-1}) \pmod p
\]
移项后得到
\[a^{n-1} \equiv (X_n+b\times inv(a-1))\times inv(X_1+b\times inv(a-1))\pmod p
\]
需要特判 \(a=1\) 和 \(a=0\) 的情况!
Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
int a,b,p,x1,xn;
inline int power(int a,int b,int p)
{
int ans=1,t=a;
while(b>0)
{
if(b%2==1) ans=ans*t%p;
b/=2;
t=t*t%p;
}
return ans;
}
inline int bsgs(int a,int b,int p)
{
if(a%p==0) return -1;
map<int,int> hash;
hash.clear();
int t=ceil(sqrt(p));
int am=power(a,t,p);
for(register int i=0;i<=t;++i)
{hash[b]=i;b=b*a%p;}
int ans=1;
for(register int i=1;i<=t;++i)
{
ans=ans*am%p;
if(hash[ans]) return i*t-hash[ans]+1;
}
return -1;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
cin>>p>>a>>b>>x1>>xn;
if(x1==xn) {cout<<1<<endl;continue;}
if(a==0) {if(xn==b) cout<<2<<endl; else cout<<-1<<endl;continue;}
if(a==1 && b==0) {cout<<-1<<endl;continue;}
if(a==1)
{
int nyb=power(b,p-2,p);
int ans=((((xn-x1)%p+p)%p)*nyb%p)%p;
cout<<ans+1<<endl;
continue;
}
int inv=b%p*power(a-1,p-2,p)%p;
int First=(xn%p+inv)%p;
int Last=(x1%p+inv)%p;
Last=power(Last,p-2,p)%p;
int ans=bsgs(a,First*Last%p,p);
cout<<ans<<endl;
}
}
距离中考百日誓师还有3天,距离中考还有100+3=103天
身子太虚了昨天晚上冲得太多了😰😰😰
你真的要看吗。