被7整除

题目描述

小萌非常喜欢能被7整除的数字,比如7,21,121996,等等。有一天他得到了n个正整数,她想用这些数制造出更多的能够被7整除的数。于是她从这n个数中选出两个数,然后将一个数写在另一个数的前面,以此得到一个新的数。按这种方法她一共可以得到个数,她想知道在这些数中,有多少个是能被7整除的。

输入描述:

第一行包含一个整数n。2 ≤n≤ 105

第二行包含n个正整数ai。1 ≤ai≤109

输出描述:

输出对应的答案。
输入输出
3
127 1996 12
4

说明

一共有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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值