3.10

chrisrmas、發表於2024-04-05

昨天放假回去得知我物件給我買了一個重雲的吧唧,真的好可愛啊🥵🥵🥵

TA不會是從廣東寄過來的吧,感動了。

說是給我的生日禮物,還有20天我才生日啊🤔🤔🤔

如果以後在亨氏看到一個戴著重雲吧唧的初中生那就是我了因為整個亨氏初中除了我沒有推重雲的🤣🤣😂

挺感動的,畢竟上了初中以後第一次有人送我生日禮物,而且還是網路上的朋友,真的感動了😭😭😭


jjdw經常在閒話裡放一些好圖,所以我找了一些爛圖

image

image

image

image

image


  • 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天

身子太虛了昨天晚上衝得太多了😰😰😰

相關文章