洛谷U406410 2024春晚之刘谦的魔术(附视频讲解)

目录

题目

题目背景

题目描述

输入格式

输出格式

输入输出样例

提示说明

题目链接

视频讲解

C++代码


题目

题目背景

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


题目链接

题目链接icon-default.png?t=N7T8https://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;
}

  • 66
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

handsomezqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值