Untitled

 avatar
unknown
plain_text
9 days ago
2.7 kB
2
Indexable
#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_set>
#include <algorithm>
using std::sort;
using std::next_permutation;
using std::unordered_set;
typedef long long ll;


class Solution {
public:
    bool judgek(int arr[], int n, int k){
        bool flg;
        do{
            flg = true;
            if(arr[0] == 0) continue;
            for(int i = 0; i < n / 2; i++){
                if(arr[i] != arr[n - i - 1]) flg = false;
            }
            if(!flg) continue;
            ll tmp = 0;
            for(int i = 0; i < n; i++){
                tmp = tmp * 10 + arr[i];
            }
            if(tmp % k == 0) return true;
        }while(next_permutation(arr, arr + n));
        return false;
    }

    int countk(int arr[], int n, int k){

        int res = 0;
        do{
            if(arr[0] == 0) continue;
            ll tmp = 0;
            for(int i = 0; i < n; i++){
                tmp = tmp * 10 + arr[i];
            }
            res++;
        }while(next_permutation(arr, arr + n));
        return res;
    }
    long long countGoodIntegers(int n, int k){
        long long res = 0;
        unordered_set<long long> st;
        int flg = 1, lens = n / 2;
        for(int i = 0; i < lens; i++){
            flg *= 10;
        }
        int arr[11];
        for(int i = 0; i < flg; i++){
            int tmp = i;
            ll hsn = 0;
            for(int j = 0; j < lens; j++){
                arr[2 * j + 1] = arr[2 * j] = tmp % 10;
                tmp /= 10;
            }
            if(n % 2 == 0){
                std::sort(arr, arr + n);
                for(int j = 0; j < n; j++){
                    hsn = hsn * 10 + arr[j];
                }
                if(st.find(hsn) != st.end()) continue;
                st.insert(hsn);
                if(!judgek(arr, n, k)) continue;
                std::sort(arr, arr + n);
                res += countk(arr, n, k);
            }else{
                int arrb[11];
                for(int j = 0; j < 10; j++, hsn = 0){
                    memcpy(arrb, arr, sizeof(arr));
                    arrb[n - 1] = j;
                    std::sort(arrb, arrb + n);

                    for(int ii = 0; ii < n; ii++){
                        hsn = hsn * 10 + arrb[ii];
                    }
                    if(st.find(hsn) != st.end()) continue;
                    st.insert(hsn);
                    if(!judgek(arrb, n, k)) continue;
                    std::sort(arrb, arrb + n);
                    res += countk(arrb, n, k);
                }
            }
        }
        return res;
    }
};

Editor is loading...
Leave a Comment