【NOIP2004】虫食算 题解

原版题目链接:NOIP2004 虫食算
简化版:所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。
BADC
+ CBDA
────
DCCC
给出一个N进制的虫食算式,相同的字母代表相同的数字,不同的字母代表不同的数字。
要求求出满足这个算式的唯一一组解,也就是字母和数字的一一对应关系.


【方法1】暴力枚举
要求一一对应的关系,就可以枚举这些一一对应的关系,找出符合的一项。这样,关系总数有O(N!)个,最坏情况下必须枚举所有的关系,并且加以判断,复杂度高达O(N*N!)!


【方法2】搜索+剪枝
首先确定搜索顺序,因为要考虑进位,我们从低位向高位搜索每个字母代表的数。
剪枝1:如果某一位时已有两个数已知,就直接求出未知数。当前位向下一位过渡时,检查加法是否成立,如果不成立就剪枝。(过8个数据)
这个剪枝就可以过大部分的数据,在剪枝1的基础上继续剪枝:
剪枝2:如果某一位已经知道3个数,从上到下设为a,b,c,在不知道进位的情况下,c=(a+b+1) mod n,或(a+b) mod n,如果c不是上述两个值,就剪枝。
剪枝3:如果某一位已知两个数,那么可以求出未知数的两个值(进位1或0),如果这两个值都已取过,就剪枝。
剪枝4:最高位没有进位,所以如果最高位的两个加数已知,且和大于n时,剪枝。
加上这4个剪枝后,过9个测试数据,剩下一个1S多。
针对这个特殊的测试点(第一个未知数特别大),需要从n-1到0枚举每个数字。


代码就不提供了,网上到处都是 : )

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mattli0231

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

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

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

打赏作者

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

抵扣说明:

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

余额充值