20分跪求大神orz求求了(玄关)
查看原帖
20分跪求大神orz求求了(玄关)
1199534
ycy1124楼主2024/5/20 21:09
		#include<bits/stdc++.h>
		using namespace std;
		long long base[3][3],ans[3][3],a[3][3];
		long long p,q,a1,a2,n,m;
		void work1(){
			for(int i=1;i<=2;i++){
				for(int j=1;j<=2;j++){
					a[i][j]=ans[i][j];
					ans[i][j]=0;
				}
			}
			for(int i=1;i<=n;i++){
				for(int j=1;j<=2;j++){
					for(int k=1;k<=2;k++){
						ans[i][j]+=base[i][k]*a[k][j];
						ans[i][j]%=m;
					}
				}
			}
		}
		void work2(){
			for(int i=1;i<=2;i++){
				for(int j=1;j<=2;j++){
					a[i][j]=base[i][j];
					base[i][j]=0;
				}
			}
			for(int i=1;i<=2;i++){
				for(int j=1;j<=2;j++){
					for(int k=1;k<=2;k++){
						base[i][j]+=a[i][k]*a[k][j];
						base[i][j]%=m;
					}
				}
			}
		}
		int main(){
			scanf("%lld%lld%lld%lld%lld%lld",&p,&q,&a1,&a2,&n,&m);
			base[1][1]=p%m;
			ans[1][1]=p%m;
			base[1][2]=1;
			ans[1][2]=1;
			base[2][1]=q%m;
			ans[2][1]=q%m;
			n-=2;
			a1%=m;
			a2%=m;
			if(n==1){
				printf("%lld",a1);
				return 0;
			}
			else if(n==2){
				printf("%lld",a2);
				return 0;
			}
			while(n){
				if(n%2==1){
					work1();
				}
				work2();
				n/=2;
			}
			long long da=ans[1][1];
			da%=m;
			printf("%lld",da);
			return 0;
		}
2024/5/20 21:09
加载中...