B.ネザールとラッキーナンバー

B.ネザールとラッキーナンバー

トピック

1、…、9の中でネザールのお気に入りの数字はdです。彼は、dが10進表現で少なくとも1回出現する場合、正の整数をラッキーと呼びます。
q個の整数a1、a2、…、aqが与えられた場合、1≤i≤qごとにNezzarは、aiがいくつかの(1つ以上の)幸運数の合計に等しくなるかどうかを知りたいと考えています。

入力
最初の行には、単一の整数t(1≤t≤9)—テストケースの数が含まれています。
各テストケースの最初の行には、2つの整数qとdが含まれています(1≤q≤104、1≤d≤9)。
各テストケースの2行目には、q個の整数a1、a2、…、aq(1≤ai≤109)が含まれています。
出力
各テストケースの各整数について、aiがラッキー数の合計に等しくなる可能性がある場合は、1行に「YES」を出力します。それ以外の場合は、「NO」と出力します。
どんな場合でも(上または下)文字を印刷できます。

例えば
inputCopy
2
3 7
24 25 27
10 7
51 52 53 54 55 56 57 58 59 60
outputCopy
YES
NO
YES
YES
YES
NO
YES
YES
YES
YES
YES
YES
NO

最初のテストケースでは、24 = 17 + 7、27自体がありますラッキーナンバー、25はラッキーナンバーの合計と等しくすることはできません。

質問を分析すると、
ad、1 <= d <= 9得られます。aという数字の1つがdである限り、aはラッキー配列と呼ばれます。次に、彼が1つを使用できるかどうかを判断するための数字を与えます。より幸運な数字の合計表現。
1 <t <9、q <= 10 ^ 4であるため、毎回最大10 ^ 5のデータを処理する必要があります。したがって、単一のデータに対するアルゴリズムの判断は、可能な限り適切に機能する必要があります。

アイデア:
YESを優先します。すべてのYES条件が満たされない場合、それはNOです。
複数のラッキーナンバーを使用してaを形成する場合、これらのナンバーの1つはdです。列挙してみてください。見つけるのは難しくありません。

①a> = 10d + 10の場合、aを2つの数n1、n2、n1はd、n2の10桁はdに分割する必要があります。このようなn1 + n2 = aが必要です。11d> a> = 10d十の位はdなので、判断する必要はありません。したがって、> = d * 10の場合に適切に機能します。

②次に、<10dを考えます。このような数をラッキーナンバーに分割できる場合、2つの可能性があります。ラッキーナンバーであるか、1位がdであるかを判断するだけです。ラッキーナンバーでない場合は、検討してください。それができるかどうか。複数のラッキーナンバーに分割します。

分割できると仮定すると、<10dであるため、これらの分割されたラッキーナンバーはdとして10桁を持つことはできず、1桁のみがdであり、aの1桁はラッキーの1桁によってのみ影響を受けることは明らかです。ラッキーナンバーの1桁はdなので、それを構成する数字(両方ともd)です。ラッキーナンバーの合計がa未満であれば、10桁であるかどうかは関係ありません。 nd <= numの場合に列挙して、ndが1桁かどうかを確認します。これはnumと同じです。つまり、aをラッキーナンバーに分割できます。

ACコード

#include <iostream>
using namespace std;

int main()
{
    
    
    int T;
    int num;
    int n, d;
    char c;
    cin >> T;

    int flag;
    for (int t = 0; t < T; t++)
    {
    
    
        cin >> n >> d;
        for (int i = 0; i < n; i++)
        {
    
    
            cin >> num;
            if (num >= d * 10 || num % 10 == d)//num >=10d 
            {
    
    
                cout << "YES" << endl;
                continue;
            }

            flag = 0;
            for (int k = 1; k*d <= num; k++)
            {
    
    
                if ( k * d % 10 == num % 10)
                {
    
    
                    cout << "YES" << endl;
                    flag = 1;
                    break;
                }
            }

            if (flag)
                continue;

            cout << "NO" << endl;
        }
    }
    //system("pause");
    return 0;
}

おすすめ

転載: blog.csdn.net/RunningBeef/article/details/113401022