#题面
#题目描述
小 Y 有一把五个拨圈的密码锁。如图所示,每个拨圈上是从 到 的数字。每个拨圈都是从 到 的循环,即 拨动一个位置后可以变成 或 ,
因为校园里比较安全,小 Y 采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度仅转动一个拨圈或者同时转动两个相邻的拨圈。
当小 Y 选择同时转动两个相邻拨圈时,两个拨圈转动的幅度相同,即小 Y 可以将密码锁从 转成 ,但不会转成 。
时间久了,小 Y 也担心这么锁车的安全性,所以小 Y 记下了自己锁车后密码锁的 个状态,注意这 个状态都不是正确密码。
为了检验这么锁车的安全性,小 Y 有多少种可能的正确密码,使得每个正确密码都能够按照他所采用的锁车方式产生锁车后密码锁的全部 个状态。
#输入格式
输入的第一行包含一个正整数 ,表示锁车后密码锁的状态数。
接下来 行每行包含五个整数,表示一个密码锁的状态。
#输出格式
输出一行包含一个整数,表示密码锁的这 个状态按照给定的锁车方式能对应多少种正确密码。
#输入输出样例
样例输入 #1
1
0 0 1 1 5
样例输出 #1
81
样例解释 #1
一共有 种可能的方案。
其中转动一个拨圈的方案有 种,转动两个拨圈的方案有 种。
样例输入 #2
见选手目录下的 lock/lock2.in 与 lock/lock2.ans。
#数据范围与约定
对于所有测试数据有:。
测试点 | 特殊性质 | |
---|---|---|
无 | ||
A | ||
无 |
特殊性质 A:保证所有正确密码都可以通过仅转动一个拨圈得到测试数据给出的 个状态。
#思路
对于每个给定的密码锁的状态,枚举其所对应的每个起始状态,然后在每种上锁状态对应的起始状态的集合之间取交集即可。
取交集的操作可以使用 std::set_intersection
函数来减少代码量。
#代码
1 |
|