1 条题解

  • 0
    @ 2025-10-8 16:54:57
    #include <bits/stdc++.h>
    using namespace std;
    bool p[15];   // 桶,标记是否出现
    bool f(int n) // 养成写子程序的好习惯,代码就不会很长
    {
        while (n)
        {
            if (p[n % 10] == 0)
                return 0; // 不包含--直接跳出
            n /= 10;
        }
        return 1;
    }
    bool check(int x, int y)
    {
        int a = x * (y % 10), b = x * (y / 10), test = x * y; // 所谓的“部分乘积”
        if (a > 999 || b > 999 || test > 9999)                // 节约时间,跳过连位数都不符合的
            return 0;
        if (f(x) == 1 && f(y) == 1 && f(a) == 1 && f(b) == 1 && f(test) == 1) // 根据“开关特性”,只要有一为假就结束判断,因此并不耗时
            return 1;
        else
            return 0;
    }
    int main()
    {
        int n, key, ans = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &key);
            p[key] = true; // 修正原代码中布尔值大小写错误
        }
        for (int i = 100; i < 1000; i++)
        {
            for (int j = 10; j < 100; j++) // 真正的暴力在这儿!
            {
                if (check(i, j) == 1)
                    ans++; // 方案数++;
            }
        }
        printf("%d\n", ans); // 输出
        return 0;
    }
    
    • 1

    【模拟】[USACO1.3] 牛式 Prime Cryptarithm

    信息

    ID
    991
    时间
    1000ms
    内存
    128MiB
    难度
    1
    标签
    递交数
    49
    已通过
    35
    上传者