日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)

發布時間:2024/4/11 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

    輔助矩陣:

    c10
    100
    101

    答案矩陣:

    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(矩阵快速幂+费马小定理降幂)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。