HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出函數f(x):
現給出n,a,b,c,mod,求f(n)對mod取模后的結果
題目分析:這個題目相對于前幾個題來說稍微加大了點難度,但還是挺水的一個題,首先我們可以對f(x)的兩邊取以a為底的log,然后就可以很輕松的得出指數的遞推式了
g(n)=g(n-1)*c+g(n-2)+b
接下來我們先于指數進行矩陣快速冪:
初始矩陣:(取n=2即可)
| g(n-1) | g(n-2) | b |
輔助矩陣:
| c | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 1 |
答案矩陣:
| g(n) | g(n-1) | b |
可是問題來了,根據該遞推式求出的答案,當n逐漸變大的同時,肯定會爆掉longlong,我們是不是需要再寫一個大整數的類來輔助一下呢?答案是不是,我們這里引進一下費馬小定理降冪,直接說結論吧:
,當且僅當p與a互質時成立
這里提一嘴,還有一個更強大的降冪方法是歐拉降冪,廣義的歐拉降冪可以處理a與p不互質的情況,因為這個題目中的p已經保證了肯定是質數,所以用費馬小定理降冪更簡單一些
知道了怎么取模,我們就可以先用矩陣快速冪跑出來質數,然后再跑一次快速冪答案就出來了
有一個細節需要注意一下,就是我們需要提前判斷一下a%p是否等于零,若等于零我們直接輸出0即可,不特判一下的話會WA
上代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #define Pi acos(-1.0) using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;LL mod;const int N=3;struct Ma {LL a[N][N];Ma(){memset(a,0,sizeof(a));}friend Ma operator*(const Ma& a,const Ma& b){Ma ans;for(int i=0;i<N;i++)for(int j=0;j<N;j++){ans.a[i][j]=0;for(int k=0;k<N;k++){ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;}}return ans;} };Ma q_pow(Ma a,LL b) {Ma ans;for(int i=0;i<N;i++)ans.a[i][i]=1;while(b){if(b&1)ans=ans*a;a=a*a;b>>=1;}return ans; }LL q_pow(LL a,LL b,LL mod) {LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans; }int main() { // freopen("input.txt","r",stdin);int w;cin>>w;while(w--){LL n,a,b,c;scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&mod);mod--;if(a%(mod+1)==0)//這里需要特判,不然會WA{printf("0\n");continue;}if(n==1){printf("%lld\n",1%(mod+1));continue;}else if(n==2){printf("%lld\n",q_pow(a,b,mod+1));continue;}Ma st;st.a[0][0]=b;st.a[0][1]=0;st.a[0][2]=b;Ma ans;ans.a[0][0]=c;ans.a[0][1]=1;ans.a[1][0]=1;ans.a[2][0]=1;ans.a[2][2]=1;ans=q_pow(ans,n-2);printf("%lld\n",q_pow(a,(st*ans).a[0][0],mod+1));}return 0; }?
總結
以上是生活随笔為你收集整理的HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 1757 A Simple
- 下一篇: POJ - 1061 青蛙的约会(扩展欧