题目描述
小萌非常喜欢能被7整除的数字,比如7,21,121996,等等。有一天他得到了n个正整数,她想用这些数制造出更多的能够被7整除的数。于是她从这n个数中选出两个数,然后将一个数写在另一个数的前面,以此得到一个新的数。按这种方法她一共可以得到个数,她想知道在这些数中,有多少个是能被7整除的。
输入描述:
第一行包含一个整数n。2 ≤n≤ 105
第二行包含n个正整数ai。1 ≤ai≤109
输出描述:
输出对应的答案。
示例1
输入
复制
3 127 1996 12
输出
复制
4
说明
一共有4种组合方式,其中:把12写在1996前面得到121996;把127写在12前面得到12712;把1996写在12前面得到199612;把1996写在127前面得到1996127;都是可以被7整除的,其余的组合方式不能被7整除。
#include<vector>
#include <cstdio>
using
namespace
std;
int
main()
{
vector<vector<
int
> > dp(10,vector<
int
>(7,0));
vector<
int
> cnt(7,0);
vector<
int
> num(10,10);
for
(
int
i=1;i<10;++i)
num[i]=10*num[i-1];
int
n,v,x,y;
scanf
(
"%d"
,&n);
for
(
int
i=0;i<n;++i)
{
scanf
(
"%d"
,&v);
x=0;
while
(v/num[x]) ++x;
y=v%7;
++cnt[y];
++dp[x][y];
}
long
res=(cnt[0]-1)*cnt[0];
for
(
int
i=1;i<7;++i){
if
(cnt[i]==0)
continue
;
for
(
int
x=0;x<10;++x){
for
(
int
y=0;y<7;++y){
if
(dp[x][y]==0)
continue
;
if
(i*num[x]%7==7-y){
if
(i==y) res+=(cnt[i]-1)*dp[x][y];
else
res+=cnt[i]*dp[x][y];
}
}
}
}
printf
(
"%ld"
,res);
}