Alien Communication Masterclass ( 2010-2011 ACM-ICPC, NEERC, Northern Subregional Contest )
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
那其实这道题就做完了。
式子怎么构造?
- 进制系统与数字表示:
进制系统的基本原理是:数字的值会根据进制的不同而变化。例如,数字"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;
}
更多推荐

所有评论(0)