1. 程式人生 > 其它 >20202304 實驗二 《資料結構與面向物件程式設計》實驗報告

20202304 實驗二 《資料結構與面向物件程式設計》實驗報告

\(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\)

#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;
} 
YJX AK IOI