BZOJ3328 PYXFIB 數論 矩陣乘法

2022-05-20 07:48:09 字數 1355 閱讀 5736

第一行乙個正整數,表示資料組資料 ,接下來t行

每行三個正整數n,k,p

t行,每行輸出乙個整數,表示結果

11 2 3

1題解:首先看到斐波那契數列我們肯定要想到矩陣乘法,但是給出的形式並不能直接求,我們試圖將其轉化為矩乘的形式。

如果不考慮k的話,我們可以設a表示斐波那契數列的轉移矩陣,然後套用二項式定理(這顯然對矩陣運算成立),得到$ans=(i+a)^n$。

如果考慮k的限制呢?所求的式子變成$\sum\limits_^n[k\mid i]c_n^if_i$。而題中保證p是質數且p%k=1,即(p-1)%k=0,p-1的出現暗示著我們可能要用到原根。

接下來就是最神的一步:設g是p的原根,$g^ k}=1$當且僅當$k\mid i$,所以令$w=g^ k}$,我們構造:$\sum\limits_^w^$,這個式子當$k\mid i$時=k,而當$k\nmid i$時,由等比數列求和可知該式=0。所以答案就可以表示成$\sum\limits_^\frac 1 k \sum\limits_^w^c_n^if_i$。

下一步也挺神的(其實應該是個我不知道的套路),我們希望對這個式子強行套用二項式定理,但是這個式子本身並不滿足二項式定理的形式,所以我們先列舉j,得到$\frac 1 k \sum\limits_^\sum\limits_^nw^c_n^if_i$。如果想套用二項式定理,我們需要式子中有乙個n-i,於是我們強行把$w^$變成$w^$,然後將$w^$提出來即可,最後的形式如下:

$\frac 1 k \sum\limits_^w^(w^i+a)^n$。

#include #include #include #include using namespace std;

typedef long long ll;

ll n,k,p,ans,g,w;

int m;

ll pri[20];

struct m

ll * operator (const int &a)

m operator * (const m &a) const

}s,t;

inline ll pm(ll x,ll y)

return z;

}inline void pm(ll y)

}inline void work()

if(t>1) pri[++m]=t;

for(g=2;;g++)

w=pm(g,(p-1)/k);

for(i=0;i

printf("%lld\n",ans*pm(k,p-2)%p);

}int main()

//1 100000000000000000 15232 998244353

BZOJ3328 PYXFIB 單位根反演

傳送門 設 a begin1 1 1 0 end 那麼要求的相當於是 sum k i binoma i 求出其中的 a 即可 n mid k frac sum omega 證明 若 n k 那麼根據單位根的消去引理可以得到就是 1 否則,等比數列求和,發現分子為 0 所以帶入單位根 sum k i ...

BZOJ 2440 完全平方數

time limit 10 sec memory limit 128 mb submit 966 solved 457 submit status 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而 這絲毫不影...

BZOJ2440 完全平方數

description 小 x 自幼就很喜歡數。但奇怪的是,他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此,他也討厭所有是完全平方數的正整數倍的數。然而 這絲毫不影響他對其他數的熱愛。這天是小x的生日,小 w 想送乙個數給他作為生日禮物。當然他不能送一 個小x討厭的數。他列出了所有小x不...