题目描述
小萌非常喜欢能被7整除的数字,比如7,21,121996,等等。有一天他得到了n个正整数,她想用这些数制造出更多的能够被7整除的数。于是她从这n个数中选出两个数,然后将一个数写在另一个数的前面,以此得到一个新的数。按这种方法她一共可以得到个数,她想知道在这些数中,有多少个是能被7整除的。
输入描述:
第一行包含一个整数n。2 ≤n≤ 105
第二行包含n个正整数ai。1 ≤ai≤109
输出描述:
输出对应的答案。
输入 | 输出 |
| |
说明
一共有4种组合方式,其中:把12写在1996前面得到121996;把127写在12前面得到12712;把1996写在12前面得到199612;把1996写在127前面得到1996127;都是可以被7整除的,其余的组合方式不能被7整除。
思路:
将D1写到D2前组成的数字能被7整除————D1*10^(len(D2))%7+D2%7=7
用一个二维列表vers[7,11]记录 data[i]*(10**j)%7余数为m的个数;
对于data[i]可能的组合数为,列表vers中vers[7-data[i]%7][len(data[i])]的值,并去除本身组合后的可被7整除的情况;
代码
n=int(input())
data=[int(x) for x in input().split()]
max_l=len(str(max(data)))
vers=[[0 for j in range(11)] for i in range(7)] #统计(d*10^j)%7的个数
for i in range(len(data)):
for j in range(1,11):
vers[data[i]*(10**j)%7][j]+=1
#print(vers)
n_c1=0
n_c=0
#以当前数为基础,寻找前边可添加的数,使组合后可以被7整除; (x*10^len(d))%7+d%7=7
for i in range(len(data)):
d=data[i] % 7
if d==0:
n_c1+=1
continue
n_c+=vers[7-d][len(str(data[i]))]
if data[i]*(10**len(str(data[i])))%7==7-d: #去掉自身可以组成被7整除的情况
n_c-=1
print(n_c+n_c1*(n_c1-1))