多項式全家桶(四):多項式快速冪,開方

       \ \ \ \ \ \ \,這是多項式的大頭了,實際使用多項式的lnlnexpexp,這裏呢,也只講lnlnexpexp的做法。


1.多項式快速冪

       \ \ \ \ \ \ \,P5245 【模板】多項式快速冪
       \ \ \ \ \ \ \,P5273 【模板】多項式冪函數 (加強版)

       \ \ \ \ \ \ \,已知:

Ak=exp(ln(A)×k)A^k=exp\left(ln(A)\times k\right)

       \ \ \ \ \ \ \,顯然求lnlnexpexp就可以出答案了。

       \ \ \ \ \ \ \,既然要求lnlnexpexp,那麼一定要考慮的是常數項的問題,洛谷的常規題面有保證 a0=1a_0=1,所以說無腦套模板就對了。

       \ \ \ \ \ \ \,那麼加強版沒有保證 a0=1a_0=1,我們如何算常數項呢?

       \ \ \ \ \ \ \,容易知道,lnln的常數項爲 ln(a0)ln(a_0)expexp的常數項是exp(ln(a0)×k)exp(ln(a_0)\times k)。好像算不出來呢。

       \ \ \ \ \ \ \,可是Ak=exp(ln(A)×k)A^k=exp\left(ln(A)\times k\right),所以說expexp的常數項是就應該是AkA^k的常數項,既 a0ka_0^k

       \ \ \ \ \ \ \,所以說我們直接知道expexp的常數項了,就不管他lnln的常數項啦。

       \ \ \ \ \ \ \,注意當a[0]=0a[0]=0時,常數項也應該是B0=0B_0=0,可是……常數項真的可以爲00嗎?

       \ \ \ \ \ \ \,我們是要求 F(B)=1BF'(B)=\frac{1}{B} 的,分母當然不能爲 00 了,所以說我們還是要單獨處理 a[0]=0a[0]=0 的情況的。

       \ \ \ \ \ \ \,把爲00的前綴提出來,然後算,最後在答案前面加上提出的長度乘上kk00即可,模板沒有管這個,需要自己注意。

inline Polynomial Power(const Polynomial &a,const int &K){
	int size=a.size();
  	Polynomial p_a=Logarithmic(a);
  	p_a.resize(size);
  	for(register int i=1;i<size;++i)p_a[i]=1ll*p_a[i]*K%mod;
  	return Exponential(p_a,power(a[0],K%(mod-1)));
  	//這裏求a[0]^k,用了歐拉定理優化
}

2.多項式開方

      &ThinSpace;\ \ \ \ \ \ \,P5205 【模板】多項式開根
      &ThinSpace;\ \ \ \ \ \ \,P5277 【模板】多項式開根 (加強版)

      &ThinSpace;\ \ \ \ \ \ \,已知:

A=exp(ln(A)2)\sqrt{A}=exp\left(\frac{ln(A)}{2}\right)

      &ThinSpace;\ \ \ \ \ \ \,同理,求lnln後,常數項帶入A0\sqrt{A_0}expexp 就可以出答案了,不是加強版的照樣直接貼模板也可以。

      &ThinSpace;\ \ \ \ \ \ \,那麼求常數項就比較講究了,我們要求的是A0%mod\sqrt{A_0}\% mod,也就是 A0A_0%mod\% mod 意義下的二次剩餘。

      &ThinSpace;\ \ \ \ \ \ \,如果會二次剩餘,可以O(logmod)O(\log mod)求,不行還可以BSGSBSGS花時間 O(mod)O(\sqrt{mod}) 求,時間差別不大,就先不放代碼了,代碼放在下一個環節,同理常數項爲 00 的時候要特殊判斷。


3.多項式開高次方

      &ThinSpace;\ \ \ \ \ \ \,U67388 【模板】多項式開高次根

      &ThinSpace;\ \ \ \ \ \ \,已知:

Ak=exp(ln(A)k)\sqrt[k]{A}=exp\left(\frac{ln(A)}{k}\right)

      &ThinSpace;\ \ \ \ \ \ \,同理,求lnln後,常數項帶入A0k\sqrt[k]{A_0}expexp 就可以出答案了,現在主要是說一下如何用BSGSBSGSA0k%mod\sqrt[k]{A_0}\% mod,高次剩餘。

      &ThinSpace;\ \ \ \ \ \ \,因爲需要保證有逆元或者可以直接除,所以需要保證 k(mod1)k|(mod-1),或者 kkmod1mod-1 互質。

inline int BSGS(int a,int b){
  	unordered_map<int,int>hash;hash.clear();b%=mod;
  	int t=(int)sqrt(mod)+1;
  	for(register int j=0;j<t;j++)hash[(int)(1ll*b*power(a,j)%mod)]=j;
  	a=power(a,t);
  	if(a==0)return b?-1:1;
  	for(register int i=0,val;i<=t;++i){
    	int j=hash.find(val=power(a,i))==hash.end()?-1:hash[val];
    	if(j>=0)return i*t-j;
  	}
  	return -1;
}
inline int Kth_Remaining(int a,int K){
	int P=BSGS(mod_g,a);
	if(P%K==0)P/=K;
	else{int x,y;exgcd(K,mod-1,x,y);if(x<0)x+=(mod-1);P=1ll*P*x%(mod-1);}
	int ret=power(mod_g,P);
	if(!(K&1))ret=min(ret,mod-ret);
	return ret;
}
inline Polynomial Kth_root(const Polynomial &a,const int &K){
	int size=a.size();
  	Polynomial s_a=Logarithmic(a);
  	s_a.resize(size);
  	int Kr=Inv(K);
  	for(register int i=1;i<size;++i)s_a[i]=1ll*s_a[i]*Kr%mod;
  	return Exponential(s_a,Kth_Remaining(a[0],K));
}

      &ThinSpace;\ \ \ \ \ \ \,模板題是周道用P5273 【模板】多項式冪函數 (加強版)的板子出的數據,跑了一下應該沒有問題,自己寫也過了,感興趣可以寫一下。因爲目前還不能保證完全的正確性,所以說沒有計劃申請加入題庫。但是目前過開方,寫過幾道題,這代碼還是沒有問題的。歡迎HackHack,有問題請聯繫QQ:2469265056。筆芯~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章