NOIP1998 进制位

进制位

题意

	给定n行长度为n的字符串,其中第一行第一个是“+”。
	这n*n个字符组成一个二维数组。如果我们用(x,y)表示第x行第y列的字符s,
	记作s (x,y);
	那么对于任意的s(x,y),都有s(x,y) = s(x, 0) + s(0, y);
	其中每个字符表示一个变量,一共有n-1个。加法的含义是k进制加法。
	题目要求对给定的字符二维数组,如果这是一张合法的加法表,
	就求出对应的k,并且为每一种字符赋一个相应的值,显然这个值在0~(k-1)之间。若不满足加法表的要求,则输出error。

一、 K的确定

直观的讲,n*n的二维数组相当于一个表格,首行和首列就是那若干个变量。数量为n-1。
这n-1个变量间两两相互做k进制下的加法得到了其余(n-1)*(n-1)的矩阵。

二、 如何快速判断出一种方案是否正确

	在进制位中有这样两个结论:
	1.每个代表元映射到[0,n-2]中的唯一一个整数,
将这个变换记作val(x)。那么对于每一个代表元s, val(s)在大小上等同于以s为首的	一行中两位字符串出现的次数time(s)。
	//一个简单证明:其实构建一行进制位表就是在对每一个val(s)和0, 1, 2... n-2求和,
	设有y个和式不会进位,那么显然这y个和式对应的整数为0, ...n-1-val(s), 一共n-val(s)个。那么进位的就是n-y == val(s);
	2.对于每个代表元S,都有xtime(S) + val(S) == n-2。
	其中xtime(S)是区别于times的另一种变换,它表示代表元S在整个进制表中二位字符串中出现在第二位的次数。
	//一个简单证明(应该是原创):
	原问题等价于:
	把这张进制位表的构建视为对于0到n-2的每个数进行n-1轮操作,
	第i轮操作对每个数都加上i,最后整个过程中出现的n-1+p的个数。
	为了方便,我们还可以将问题转化成:
	在1-n这n个整数中,进行n次操作,第i次对每个数都加上i, 统计这个过程中最大值n+x出现的次数xtimes。
	分开每个数考虑:最大的数n从n变成n+n,出现一次n+x, 第二大的数从n-1变到n+n-1,是否出现n+x取决于x的大小!
	每个数m都是从m变到了m+n, 是否出现n+x取决于x与m的大小。
	那么所有比x小的数,都不会出现x。
	所有比x大的数,都会出现x。
	至此,xtimes(x) = n-x(此问题中)
	回到原问题,最大值更为n-2, 结论变成:xtimes(p) = n-2 - p;	
	证毕。

由此,我们既得到了每一个val(s)的计算方法,又得到了判断一张进制位表是否合法的标准条件,题目解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值