20202304 實驗二 《資料結構與面向物件程式設計》實驗報告
阿新 • • 發佈:2021-09-28
求 \(X_n=xX_{n-1}+c\bmod m\)
\(ans=X_n\bmod c\)
給出
構造
\(\begin{bmatrix}X_n\\c\end{bmatrix}\)
則
\(\begin{bmatrix}X_n\\c\end{bmatrix}=\begin{bmatrix}x & 1\\0 & 1\end{bmatrix}\times\begin{bmatrix}X_{n-1}\\c\end{bmatrix}\)
則 \(ans=\begin{bmatrix}a & 1\\0 & 1\end{bmatrix}^n\times\begin{bmatrix}X_0\\c\end{bmatrix}\bmod g\)
YJX AK IOI#include<bits/stdc++.h> using namespace std; #define int long long int mul(int a,int b,int mod){ __int128 s=a,t=b; __int128 p=s*t; p%=mod; int T=p; return T; } int mod,a,c,x0,n,g; struct matrix{ int a[5][5]; int n,m; }; matrix operator *(matrix a,matrix b){ matrix c; assert(a.m==b.n); c.n=a.n,c.m=b.m; for(int i=1;i<=c.n;i++){ for(int j=1;j<=c.m;j++){ int sum=0; for(int k=1;k<=a.m;k++)sum+=mul(a.a[i][k],b.a[k][j],mod),sum%=mod; c.a[i][j]=sum; } } return c; } matrix ksm(matrix a,int b){ if(b==1)return a; matrix ans=ksm(a,b>>1); if(b&1)return ans*ans*a; else return ans*ans; } matrix F,P; signed main(){ cin>>mod>>a>>c>>x0>>n>>g; F.n=2,F.m=1,F.a[1][1]=x0,F.a[2][1]=c; P.n=P.m=2,P.a[1][1]=a,P.a[1][2]=1,P.a[2][1]=0,P.a[2][2]=1; cout<<(ksm(P,n)*F).a[1][1]%g; return 0; }