专栏文章
题解:B3761 [信息与未来 2021] 三角魔方
B3761题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipq6mey
- 此快照首次捕获于
- 2025/12/03 16:08 3 个月前
- 此快照最后确认于
- 2025/12/03 16:08 3 个月前
思路如下:
首先观察,发现 U1, D1, R1 都没用,直接过;
其次,令 A 编码为 ,B为 ,在代码中用 c[0] 来代表 A, c[1] 代表 B,则不难得出 make 函数:
(例子: D7 的变化过程)


核心函数
CPPvoid 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;
}
}
而且,这道题 , ,略巨大,明显要用快速幂和试验规律,发现:
对于每种操作,都会出现若干次操作后返回初始状态的情况,出现规律!
找到规律后,再略微操作下,即得正解!
行了,我知道你们只看这儿, 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 条评论,欢迎与作者交流。
正在加载评论...