[NOIP1998 提高组] 进制位
题目描述
著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:
+ L K V E L L K V E K K V E K L V V E K L K K E E K L K K K V \def\arraystretch{2} \begin{array}{c||c|c|c|c} \rm + & \kern{.5cm} \rm \mathclap{L} \kern{.5cm} & \kern{.5cm} \rm \mathclap{K} \kern{.5cm} & \kern{.5cm} \rm \mathclap{V} \kern{.5cm} & \kern{.5cm} \rm \mathclap{E} \kern{.5cm} \\ \hline\hline \rm L & \rm L & \rm K & \rm V & \rm E \\ \hline \rm K & \rm K & \rm V & \rm E & \rm \mathclap{KL} \\ \hline \rm V & \rm V & \rm E & \rm \mathclap{KL} & \rm \mathclap{KK} \\ \hline \rm E & \rm E & \rm \mathclap{KL} & \rm \mathclap{KK} & \rm \mathclap{KV} \\ \end{array} +LKVELLKVEKKVEKLVVEKLKKEEKLKKKV
其含义为:
L + L = L L+L=L L+L=L, L + K = K L+K=K L+K=K, L + V = V L+V=V L+V=V, L + E = E L+E=E L+E=E
K + L = K K+L=K K+L=K, K + K = V K+K=V K+K=V, K + V = E K+V=E K+V=E, K + E = K L K+E=KL K+E=KL
⋯ \cdots ⋯
E + E = K V E+E=KV E+E=KV
根据这些规则可推导出: L = 0 L=0 L=0, K = 1 K=1 K=1, V = 2 V=2 V=2, E = 3 E=3 E=3。
同时可以确定该表表示的是 4 4 4 进制加法。
输入格式
第一行一个整数 n n n( 3 ≤ n ≤ 9 3\le n\le9 3≤n≤9)表示行数。
以下 n n n 行,每行包括 n n n 个字符串,每个字符串间用空格隔开。)
若记 s i , j s_{i,j} si,j 表示第 i i i 行第 j j j 个字符串,数据保证 s 1 , 1 = + s_{1,1}=\texttt + s1,1=+, s i , 1 = s 1 , i s_{i,1}=s_{1,i} si,1=s1,i, ∣ s i , 1 ∣ = 1 |s_{i,1}|=1 ∣si,1∣=1, s i , 1 ≠ s j , 1 s_{i,1}\ne s_{j,1} si,1=sj,1 ( i ≠ j i\ne j i=j)。
保证至多有一组解。
输出格式
第一行输出各个字母表示什么数,格式如:L=0 K=1
⋯
\cdots
⋯ 按给出的字母顺序排序。不同字母必须代表不同数字。
第二行输出加法运算是几进制的。
若不可能组成加法表,则应输出 ERROR!
。
样例 #1
样例输入 #1
5
+ L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
样例输出 #1
L=0 K=1 V=2 E=3
4
提示
NOIP1998 提高组 第三题
思路
一般来说进制数就刚好等于字母数,但我们得注意一下边界条件。
- 每个数的取值为k在每行出现的次数。
- 如果不满足对应位置加起来等于当前位置,那么就是错的。
证明过程如下:
代码
//观察规律可知:字母的所对应的数字应该是K的个数(对于每行来说)
#include<iostream>
#include<map>
using namespace std;
const int N = 25;
int n;
string s[N][N];
map <char,int> ma;
bool check(int x,int y){
int now=ma[s[x][0][0]]+ma[s[y][0][0]];
string a=s[x][y];
int sum=0;
for(int i=0;i<a.size();i++){
sum=sum*(n-1)+ma[a[i]];
}
if(sum==now)return 1;
return 0;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>s[i][j];
if(s[i][j].size()>=2&&i!=0){
ma[s[i][0][0]]++;
}
}
}
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
if(!check(i,j)){
puts("ERROR!");
return 0;
}
}
}
for(int i=1;i<n;i++){
cout<<s[i][0]<<"="<<ma[s[i][0][0]]<<" ";
}
cout<<endl;
cout<<n-1;
return 0;
}