Alien Communication Masterclass ( 2010-2011 ACM-ICPC, NEERC, Northern Subregional Contest

在这里插入图片描述
在这里插入图片描述

题目大意

题目要求我们为Andrea的外星人交流课堂提供一个数学等式,这个等式在某些进制系统下成立,在其他进制系统下不成立。等式可以包含加法、减法、乘法、括号、负号和等号等数学符号,并且只使用数字0到9。我们需要根据给定的进制范围,构造一个数学等式,满足它在某些进制系统下成立,但在其他进制系统下不成立。

输入提供了两个整数n和m,表示存在n个基数a1, a2, …, an以及m个基数b1, b2, …, bm。我们需要输出一个数学等式,使得它在进制为a1, a2, …, an的系统下成立,但在进制为b1, b2, …, bm的系统下不成立。

题解

一道非常简单小巧的思维题。

首先我们需要构造一个通式,咱们就是说,让每一个进制都成立,那就是某一条式子,让每个进制下,左边的式子都等于右边的值。

那我们可以想到 (式子 1 ) ∗ (式子 2 ) ∗ ⋅ ⋅ ⋅ (式子 n ) = 0 (式子1)*(式子2)*···(式子n)=0 (式子1(式子2⋅⋅⋅(式子n=0

那其实这道题就做完了。

式子怎么构造?

  1. 进制系统与数字表示
    进制系统的基本原理是:数字的值会根据进制的不同而变化。例如,数字"10"在不同进制下表示不同的值:
    • 在十进制中,"10"表示10。
    • 在二进制中,"10"表示2。
    • 在八进制中,"10"表示8。

那我们每一条式子就是$ ( 10 - 1 - 1···-1 )$

就是n进制减去n个1即可,这样该条式子只在n进制下为0

就这么简单

代码分析

#include<bits/stdc++.h>
using namespace std;
#define int long long

// 函数生成格式化的 "(10 - 1) * ... * (10 - 1)"
string dodo(int x)
{
    string s="(10";
    for(int i=0;i<x;++i)
    {
        s+=" - 1";
    }
    s+=")";
    return s;
}

signed main()
{
    freopen("acm.in","r",stdin);
    freopen("acm.out","w",stdout);
    
    int n, m;
    cin >> n >> m;
    vector<int> v, vv;
    
    // 读取n个进制
    for(int i = 0; i < n; ++i)
    {
        int x;
        cin >> x;
        v.push_back(x);
    }
    
    // 读取m个进制
    for(int i = 0; i < m; ++i)
    {
        int x;
        cin >> x;
        vv.push_back(x);
    }
    
    // 生成表达式
    string ans;
    for(int i = 0; i < v.size(); ++i)
    {
        if(i == 0)
        {
            ans += dodo(v[i]);
        }
        else
        {
            ans += " * ";
            ans += dodo(v[i]);
        }
    }
    ans += " * 10 = 0";
    
    // 输出答案
    cout << ans << endl;
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐