哪位大佬帮我看看哪错了啊,呜呜呜
查看原帖
哪位大佬帮我看看哪错了啊,呜呜呜
1597900
litao0125楼主2024/12/8 21:40
#define MOD 1000000007
#include<stdio.h>
typedef struct{
	long long arr[6][6];
}M;
int n,m;
int op[7];
void init(){
	op[1] = 4;
	op[4] = 1;
	op[2] = 5;
	op[5] = 2;
	op[3] = 6;
	op[6] = 3;
}
long long fun(long long a,long long n){
	long long r = 1;
	while(n > 0){
		if(n & 1)
			r = (r*a)%MOD;
		a =(a*a)%MOD;
		n = n>>1;
	}
	return r;
}
M j_z_xc(M m1,M m2){
	M ans;
	for(int i = 0;i < 6;i++){
		for(int k = 0;k < 6;k++){
			ans.arr[i][k] = 0;
			for(int j = 0;j < 6;j++){
				ans.arr[i][k] += m1.arr[i][j]*m2.arr[j][k]%MOD;
			}
		}
	}
	return ans;
}
M mpow(M m,int k){
	M ans;
	for(int i = 0;i < 6;i++){
		for(int j = 0;j < 6;j++){
			if(i == j){
				ans.arr[i][j] = 1;
			}else{
				ans.arr[i][j] = 0;
			}
		}
	}
	while(k > 0){
		if(k & 1){
			ans = j_z_xc(ans,m);
		}
		m = j_z_xc(m,m);
		k = k>>1;
	}
	return ans;
}
int main(){
	init();
	scanf("%d %d",&n,&m);
	M c_t;
	for(int i = 0;i < 6;i++){
		for(int j = 0;j < 6;j++){
			c_t.arr[i][j] = 1;
		}
	}
	for(int i = 0;i < m;i++){
		int a,b;
		scanf("%d %d",&a,&b);
		c_t.arr[op[a]-1][b-1] = 0;
		c_t.arr[op[b]-1][a-1] = 0;
	}
	M c_t_n_1 = mpow(c_t,n-1);
	long long sum = 0;
	for(int i = 0;i < 6;i++){
		for(int j = 0;j < 6;j++){
			sum += c_t_n_1.arr[i][j]%MOD;
		}
	}
	long long num = fun(4,n);
	printf("%lli",sum*num%MOD);
	return 0;
}
2024/12/8 21:40
加载中...