找规律——[NOIP1998 提高组] 进制位

文章讲述了如何根据给定的加法表推导出每个字母代表的数字,以及确定该加法表表示的是4进制。通过检查字母出现次数来验证是否符合进制规则,若不满足则输出ERROR!
摘要由CSDN通过智能技术生成

[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 3n9)表示行数。

以下 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; 
}
  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

green qwq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值