目录
题目
题目背景
2024 年春晚,刘谦的魔术因小尼穿帮而上热搜,其背后的数学原理也让人深思,小明想知道除了这组数还有哪些数字可以使魔术成功。
刘谦的魔术步骤如下:
步骤 1:将准备好的 4 张扑克牌平均撕成两份,并叠在一起。
步骤 2:将牌堆顶数量为【名字字数】的牌移至牌堆底。
步骤 3:将前三张牌放在牌堆中间并取出牌堆顶的牌,放置在一旁。
步骤 4:取出牌堆顶的若干张牌插入牌堆中间,此处选择的牌数为南方人取 1 张,北方人取 2 张,若不确定是南方人还是北方人取 3 张。
步骤 5:男生扔掉牌堆顶 1 张,女生扔掉牌堆顶 2 张。
步骤 6:执行“见证奇迹的时刻”循环,每说一个字,就取出牌堆顶一张牌放置在牌堆底。
步骤 7:从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌,检查此牌和放置在一旁的牌是否吻合。若吻合,则魔术成功。
题目描述
修改后的步骤如下:
步骤 1:将准备好的 a 张扑克牌平均撕成两份,并叠在一起。
步骤 2:将牌堆顶数量为【名字字数】的牌移至牌堆底。
步骤 3:将前 b 张牌放在牌堆中间并取出牌堆顶的牌,放置在一旁。
步骤 4:取出牌堆顶的若干张牌插入牌堆中间,此处张数任意(保证在张数允许的范围内,在张数不允许的情况下也可省略这一步),但是不能改变最下面的牌。
步骤 5:男生扔掉牌堆顶 c 张,女生扔掉牌堆顶 d 张。
步骤 6:执行 e 次循环,每次循环,就取出牌堆顶一张牌放置在牌堆底。
步骤 7:从牌堆顶开始,每次先将牌堆顶的一张牌放在牌堆底,再扔掉牌堆顶的一张牌,重复以上操作直到只剩一张牌,检查此牌和放置在一旁的牌是否吻合。若吻合,则魔术成功。
输入格式
顺次输入 a, b, c, d, e
输出格式
若可行,输出"Yes",若不可行,输出"No"。
输入输出样例
提示说明
对于 100% 的数据,1≤a, b, c, d, e≤10
题目链接
题目链接https://www.luogu.com.cn/problem/U406410
视频讲解
C++代码
//本题出题人+代码录入人:山东财经大学张淇皓
#include<bits/stdc++.h>
using namespace std;
bool m[15];
bool n[15];
int main()
{
int a,b,c,d,e,i;
cin>>a>>b>>c>>d>>e;
if(b!=a-1)
{
cout<<"No";
return 0;
}
else
{
int s1=2*a-1-c;
int s2=2*a-1-d;
int t1=s1-e%s1;
int t2=s2-s2%e;
int bj=1;
for(i=1;i<s1;i++)
{
while(m[bj]!=0)
{
bj++;
if(bj>s1)
bj=1;
}
bj++;
if(bj>s1)
bj=1;
while(m[bj]!=0)
{
bj++;
if(bj>s1)
bj=1;
}
m[bj]=1;
}
if(m[t1]!=0)
{
cout<<"No";
return 0;
}
bj=1;
for(i=1;i<s2;i++)
{
while(n[bj]!=0)
{
bj++;
if(bj>s2)
bj=1;
}
bj++;
if(bj>s2)
bj=1;
while(n[bj]!=0)
{
bj++;
if(bj>s2)
bj=1;
}
n[bj]=1;
}
if(n[t2]!=0)
{
cout<<"No";
return 0;
}
}
cout<<"Yes";
return 0;
}