专栏文章

题解:B3761 [信息与未来 2021] 三角魔方

B3761题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipq6mey
此快照首次捕获于
2025/12/03 16:08
3 个月前
此快照最后确认于
2025/12/03 16:08
3 个月前
查看原文
思路如下:
首先观察,发现 U1, D1, R1 都没用,直接过;
其次,令 A 编码为 00,B为 11,在代码中用 c[0] 来代表 A, c[1] 代表 B,则不难得出 make 函数:

(例子: D7 的变化过程) (例子:D7的变化过程)

核心函数
CPP
void make(string thing) {//ting是操作类型
	char t;
	if(thing=="R3") {
		t=c[1];
		c[1]=c[3];
		c[3]=c[2];
		c[2]=t;
	}
	else if(thing=="R5") {
		t=c[4];
		c[4]=c[8];
		c[8]=c[7];
		c[7]=c[6];
		c[6]=c[5];
		c[5]=t;
	}
	else if(thing=="R7") {
		t=c[9];
		c[9]=c[15];
		c[15]=c[14];
		c[14]=c[13];
		c[13]=c[12];
		c[12]=c[11];
		c[11]=c[10];
		c[10]=t;
	}
	else if(thing=="D3") {
		t=c[13];
		c[13]=c[14];
		c[14]=c[8];
		c[8]=t;
	}
	else if(thing=="D5") {
		t=c[11];
		c[11]=c[12];
		c[12]=c[6];
		c[6]=c[7];
		c[7]=c[3];
		c[3]=t;
	}
	else if(thing=="D7") {
		t=c[9];
		c[9]=c[10];
		c[10]=c[4];
		c[4]=c[5];
		c[5]=c[1];
		c[1]=c[2];
		c[2]=c[0];
		c[0]=t;
	}
	else if(thing=="U3") {
		t=c[4];
		c[4]=c[10];
		c[10]=c[11];
		c[11]=t;
	}
	else if(thing=="U5") {
		t=c[1];
		c[1]=c[5];
		c[5]=c[6];
		c[6]=c[12];
		c[12]=c[13];
		c[13]=t;
	}
	else if(thing=="U7") {
		t=c[0];
		c[0]=c[2];
		c[2]=c[3];
		c[3]=c[7];
		c[7]=c[8];
		c[8]=c[14];
		c[14]=c[15];
		c[15]=t;
	}
} 
而且,这道题 aa, b1000b\le1000,略巨大,明显要用快速幂和试验规律,发现:
对于每种操作,都会出现若干次操作后返回初始状态的情况,出现规律!
找到规律后,再略微操作下,即得正解!

行了,我知道你们只看这儿, NO 抄袭!

CPP
#include<bits/stdc++.h>
using namespace std;
int k;
string c="ABCDEFGHIJKLMNOP";
map<string,bool> mp;
void make(string thing) {
	char t;
	if(thing=="R3") {
		t=c[1];
		c[1]=c[3];
		c[3]=c[2];
		c[2]=t;
	}
	else if(thing=="R5") {
		t=c[4];
		c[4]=c[8];
		c[8]=c[7];
		c[7]=c[6];
		c[6]=c[5];
		c[5]=t;
	}
	else if(thing=="R7") {
		t=c[9];
		c[9]=c[15];
		c[15]=c[14];
		c[14]=c[13];
		c[13]=c[12];
		c[12]=c[11];
		c[11]=c[10];
		c[10]=t;
	}
	else if(thing=="D3") {
		t=c[13];
		c[13]=c[14];
		c[14]=c[8];
		c[8]=t;
	}
	else if(thing=="D5") {
		t=c[11];
		c[11]=c[12];
		c[12]=c[6];
		c[6]=c[7];
		c[7]=c[3];
		c[3]=t;
	}
	else if(thing=="D7") {
		t=c[9];
		c[9]=c[10];
		c[10]=c[4];
		c[4]=c[5];
		c[5]=c[1];
		c[1]=c[2];
		c[2]=c[0];
		c[0]=t;
	}
	else if(thing=="U3") {
		t=c[4];
		c[4]=c[10];
		c[10]=c[11];
		c[11]=t;
	}
	else if(thing=="U5") {
		t=c[1];
		c[1]=c[5];
		c[5]=c[6];
		c[6]=c[12];
		c[12]=c[13];
		c[13]=t;
	}
	else if(thing=="U7") {
		t=c[0];
		c[0]=c[2];
		c[2]=c[3];
		c[3]=c[7];
		c[7]=c[8];
		c[8]=c[14];
		c[14]=c[15];
		c[15]=t;
	}
} 
int fastpow(int a,int b) {
	if(b==0) return 1;
	else if(b==1) return a%k;
	else if(b%2==0) return fastpow((a%k)*(a%k)%k,b/2);
	else return (a%k)*fastpow(a,b-1)%k;
}
int main() {
	string s;
	cin>>s;
	int n,m;
	cin>>n>>m;
	for(int i=0;;i++) {
		if(mp[c]!=1) mp[c]=1;
		else {
			k=i;
			break;
		}
		string t="";
		for(int j=0;j<s.size()/2;j++) {
			t="";
			t+=s[j*2];
			t+=s[j*2+1];
			make(t);
		}
	}
	int sum=fastpow(n%k,m);
	while(sum--) {
		string t="";
		for(int j=0;j<s.size()/2;j++) {
			t="";
			t+=s[j*2];
			t+=s[j*2+1];
			make(t);
		}
	}
	cout<<c;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...