2018年全国多校算法寒假训练营练习比赛(第一场)I - 找数字个数

时间:2022-08-18 00:20:23

题目:
lulu喜欢小于等于1000的正整数,但是如果某个数是a或b的倍数,lulu会讨厌这个数。如果某个数里包含了a和b两个数里包含的数,lulu也会讨厌。(例如a=14,b=23,如果数字中包含1、2、3、4这四个数中的任意一个数,lulu就会讨厌这个数)。现在告诉你a,b,你能说出lulu喜欢的数有多少个么。
Input:
第一行是样例数T
第2到2+T-1行每行有2个整数a b。
Output:
输出lulu喜欢的数的个数
Sample Input:
3
2 3
14 23
1234 5678
Sample Output:
171
190
7
题目链接
思路:把输入两个数的每一位数拆分标记,对范围内所有数字打表
AC代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;

bool Judge[10] = {0};       // 用Judge判断输入的两个数中包含那些数
int d[5] = {10,100,1000,10000,100000};  // 利用d数组取出每位数
bool IsLike[1010];              // 对不喜欢的数打表
int a,b;                    // 输入的两个数

void _Judge(int x,int y) {      // _Judge函数判断输入的两个数中包含哪些数
    mem(Judge, 0);              // 初始化判断包含元素的数组
    for (int i = 0;i < 5;++i) {     // 循环提取每位数
        int a1 = a,b1 = b;      // 利用中间变量a1,b1提取
        if (a >= d[i]) {
            a1 /= d[i];
        }
        if (b > d[i]) {
            b1 /= d[i];
        }
        a1 %= 10;
        b1 %= 10;
        Judge[a1] = 1;          // 将提取出来的数标记
        Judge[b1] = 1;
    }
}

void Like() {                   // Like函数对IsLike数组打表
    mem(IsLike, 0);             // 初始化打表数组
    for (int i = 0;i < 1010;++i) {      // 遍历打表
        if (i % a == 0 || i % b == 0) {     // 判断整除条件
            IsLike[i] = 1;          // 如果可以整除则打表继续循环下个数
            continue;
        }
        for (int j = 0;j < 3;++j) {     // 循环判断是否含有输入数中的数
            int judgeLike = i;
            if (i >= d[j]) {
                judgeLike /= d[j];
            }
            judgeLike %= 10;
            if (Judge[judgeLike] == 1) {        // 如果含有则打表继续循环下个数
                IsLike[i] = 1;
                break;
            }
        }
    }
}

int main() {
    // 加速输入输出
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;           // 输入测试组数
    while (T--) {
        cin >> a >> b;
        _Judge(a,b);        // 提取每位数
        Like();             // 打表
        ll sum = 0;
        for (int i = 1;i <= 1000;++i) {     // 循环统计表中未被标记过的喜欢数
            if (IsLike[i] == 0) {
                sum++;
            }
        }
        cout << sum << endl;            // 输出
    }
    return 0;
}