列表

详情


MT39. 被 7 整除

描述

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

数据范围:

输入描述

第一行包含一个整数n。

第二行包含n个正整数ai

输出描述

输出对应的答案。

示例1

输入:

3
127 1996 12

输出:

4

说明:

一共有4种组合方式,其中:把12写在1996前面得到121996;把127写在12前面得到12712;把1996写在12前面得到199612;把1996写在127前面得到1996127;都是可以被7整除的,其余的组合方式不能被7整除。

原站题解

C++ 解法, 执行用时: 13ms, 内存消耗: 996KB, 提交时间: 2020-10-29

#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);
}

C++ 解法, 执行用时: 13ms, 内存消耗: 996KB, 提交时间: 2020-07-28

#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);
}

上一题