开始 2026-04-17 00:00:00

童织码编程:月赛A组——4

结束 2026-05-11 00:00:00
Contest is over.
当前 2026-06-10 07:52:47

D. 26年4月-A组(萌新)D. 银行卡

描述

某银行发行了一种 18 位长度的银行卡号,其编码规则如下:

1.前 6 位(第 1 到 6 位)为发卡行识别码,用于标识发卡机构。
2.第 7 到 14 位为账户开立日期,格式为 YYYYMMDD,例如 20250510 表示 2025 年 5 月 10 日。
3.第 15 到 17 位为账户序号,用于区分同一天在同一发卡行开立的多个账户。其中第 17 位为奇数表示该账户为对公账户,偶数表示个人账户。
4.第 18 位为校验位,其值可为数字 0-9 或大写字母 X(X 代表数值 10)。银行采用 ISO 7064:1983 MOD 11-2 校验算法,当且仅当下列等式成立时校验通过:

即:

其中 ai 表示卡号第 i 位字符对应的数值(第 1 位为最高位,第 18 位为校验位),X 对应数值 10。

除校验位验证外,系统还要求开立日期必须为合法存在的日期,且介于 1900 年 1 月 1 日至 2025 年 5 月 10 日之间(包含端点)。

日期合法性需考虑闰年:能被 4 整除但不能被 100 整除的年份为闰年,能被 400 整除的年份也为闰年(例如 2000 年是闰年,1900 年不是)。闰年 2 月有 29 天,平年 2 月有 28 天。

输入

第一行一个整数 T,表示待校验的卡号数量。

接下来 T 行,每行一个长度为 18 的字符串(前 17 个字符保证为数字,第 18 个字符为数字或大写字母 X),表示一个待校验的银行卡号。

输出

对于每个卡号,输出一行:若所有校验条件均通过,则输出 PASS,否则输出 FAIL。输出均为大写字母。

样例

输入

2
14021320141203937X
140213201412039372

输出

PASS
FAIL

输入

5
11260019811223188X
13303720061018861X
13539819111030170X
122801192101033134
126648196812304507

输出

PASS
FAIL
FAIL
PASS
PASS

提示

说明

样例说明

·第一个卡号 14021320141203937X:

前 6 位 140213 为发卡行识别码。
第 7 到 14 位 20141203 表示开立日期为 2014 年 12 月 3 日,
该日期在 1900 年 1 月 1 日至 2025 年 5 月 10 日之间且合法(2014 年不是闰年,12 月有 31 天,3 日存在)。
第 15 到 17 位 937,第 17 位为 7(奇数),对应对公账户。
校验计算:将第 18 位 X 视为 10,代入公式得到余数为 1,校验通过。
因此输出 PASS。

·第二个卡号 140213201412039372:

前 17 位与上一个卡号完全相同,但第 18 位为数字 2。代入校验公式计算,余数不为 1,校验失败。
因此输出 FAIL。

数据范围

对于 30% 的数据,卡号中的日期部分保证是 1900 年 1 月 1 日至 2025 年 5 月 10 日之间的合法日期。

对于 100% 的数据,T≤10,000。


Submit

登录

注册
时间限制 1 秒
内存限制 128 MB
提交