光速冪學習筆記 & P1226 【模板】快速冪||取餘運算

背景:

別跟我說這是快速冪,小心我用底數相同的數據卡你。

題目傳送門:

https://www.luogu.org/problem/P1226

題意:

求:nkmod  pn^k\mod p

思路:

學習快速冪的請自覺屏蔽。
可能有邊界問題,實際以代碼爲準。
考慮k>nk>\lfloor\sqrt{n}\rfloor時:
nk=nnnnnknnnn^k=n^{\lfloor\frac{n}{\lfloor\sqrt{n}\rfloor}\rfloor\lfloor\sqrt{n}\rfloor}\cdot n^{k-\lfloor\frac{n}{\lfloor\sqrt{n}\rfloor}\rfloor\lfloor\sqrt{n}\rfloor}

我們考慮到nn<=n,knnn<n\lfloor\frac{n}{\lfloor\sqrt{n}\rfloor}\rfloor<=\sqrt{n},k-\lfloor\frac{n}{\lfloor\sqrt{n}\rfloor}\rfloor\lfloor\sqrt{n}\rfloor<\lfloor\sqrt{n}\rfloor
因此Θ(n)\Theta(\sqrt{n})預處理n1,n2,n3,...,nnn^{1},n^{2},n^{3},...,n^{\lfloor\sqrt{n}\rfloor}n2n,n3n,...,nnnn^{2\lfloor\sqrt{n}\rfloor},n^{3\lfloor\sqrt{n}\rfloor},...,n^{\lfloor\sqrt{n}\rfloor\lfloor\sqrt{n}\rfloor},然後套用上面的式子Θ(1)\Theta(1)查詢即可。

這個專門針對喪心病狂的出題人在線卡快速冪。
侷限性:只適用於底數相同或底數較少的冪次方計算。且預處理要Θ(n)\Theta(\sqrt{n})

代碼:

SqrtSqrt要取n+1\lfloor\sqrt{n}\rfloor+1,防止邊界等問題。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
	LL n,k,p,Sqrt;
	LL block1[10000010],block2[10000010];
void init()
{
	block1[0]=1%p;
	for(int i=1;i<=Sqrt;i++)
		block1[i]=block1[i-1]*n%p;
	block2[0]=1%p;
	for(int i=1;i<=Sqrt;i++)
		block2[i]=block2[i-1]*block1[Sqrt]%p;
}
LL Pow(LL x,LL k)
{
	return k<=Sqrt?block1[k]:block2[k/Sqrt]*block1[k-k/Sqrt*Sqrt]%p;
}
int main()
{
	scanf("%lld %lld %lld",&n,&k,&p);
	Sqrt=sqrt(k)+1;
	init();
	printf("%lld^%lld mod %lld=%lld",n,k,p,Pow(n,k));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章