//#define _GLIBCXX_DEBUG #include using namespace std; #define endl '\n' #define lfs cout<= (ll)(n); i--) using ll = long long; using ld = long double; const ll MOD1 = 1e9+7; const ll MOD9 = 998244353; const ll INF = 1e18; using P = pair; template using PQ = priority_queue; template using QP = priority_queue,greater>; templatebool chmin(T1 &a,T2 b){if(a>b){a=b;return true;}else return false;} templatebool chmax(T1 &a,T2 b){if(avoid ans(bool x,T1 y,T2 z){if(x)cout<void anss(T1 x,T2 y,T3 z){ans(x!=y,x,z);}; templatevoid debug(const T &v,ll h,ll w,string sv=" "){for(ll i=0;ivoid debug(const T &v,ll n,string sv=" "){if(n!=0)cout<void debug(const vector&v){debug(v,v.size());} templatevoid debug(const vector>&v){for(auto &vv:v)debug(vv,vv.size());} templatevoid debug(stack st){while(!st.empty()){cout<void debug(queue st){while(!st.empty()){cout<void debug(deque st){while(!st.empty()){cout<void debug(PQ st){while(!st.empty()){cout<void debug(QP st){while(!st.empty()){cout<void debug(const set&v){for(auto z:v)cout<void debug(const multiset&v){for(auto z:v)cout<void debug(const array &a){for(auto z:a)cout<void debug(const map&v){for(auto z:v)cout<<"["<vector>vec(ll x, ll y, T w){vector>v(x,vector(y,w));return v;} ll gcd(ll x,ll y){ll r;while(y!=0&&(r=x%y)!=0){x=y;y=r;}return y==0?x:y;} vectordx={1,-1,0,0,1,1,-1,-1};vectordy={0,0,1,-1,1,-1,1,-1}; templatevector make_v(size_t a,T b){return vector(a,b);} templateauto make_v(size_t a,Ts... ts){return vector(a,make_v(ts...));} templateostream &operator<<(ostream &os, const pair&p){return os << p.first << " " << p.second;} templateostream &operator<<(ostream &os, const vector &v){for(auto &z:v)os << z << " ";cout<<"|"; return os;} templatevoid rearrange(vector&ord, vector&v){ auto tmp = v; for(int i=0;ivoid rearrange(vector&ord,Head&& head, Tail&&... tail){ rearrange(ord, head); rearrange(ord, tail...); } template vector ascend(const vector&v){ vectorord(v.size());iota(ord.begin(),ord.end(),0); sort(ord.begin(),ord.end(),[&](int i,int j){return v[i] vector descend(const vector&v){ vectorord(v.size());iota(ord.begin(),ord.end(),0); sort(ord.begin(),ord.end(),[&](int i,int j){return v[i]>v[j];}); return ord; } ll FLOOR(ll n,ll div){return n>=0?n/div:(n-div+1)/div;} ll CEIL(ll n,ll div){return n>=0?(n+div-1)/div:n/div;} ll digitsum(ll n){ll ret=0;while(n){ret+=n%10;n/=10;}return ret;} templateT min(const vector&v){return *min_element(v.begin(),v.end());} templateT max(const vector&v){return *max_element(v.begin(),v.end());} templateT acc(const vector&v){return accumulate(v.begin(),v.end(),T(0));}; templateT reverse(const T &v){return T(v.rbegin(),v.rend());}; //mt19937 mt(chrono::steady_clock::now().time_since_epoch().count()); int popcount(ll x){return __builtin_popcountll(x);}; int poplow(ll x){return __builtin_ctzll(x);}; int pophigh(ll x){return 63 - __builtin_clzll(x);}; templateT poll(queue &q){auto ret=q.front();q.pop();return ret;}; templateT poll(priority_queue &q){auto ret=q.top();q.pop();return ret;}; templateT poll(QP &q){auto ret=q.top();q.pop();return ret;}; templateT poll(stack &s){auto ret=s.top();s.pop();return ret;}; template< typename T = int > struct edge { int to; T cost; int id; edge():id(-1){}; edge(int to, T cost = 1, int id = -1):to(to), cost(cost), id(id){} operator int() const { return to; } }; template using Graph = vector>>; template Graphrevgraph(const Graph &g){ Graphret(g.size()); for(int i=0;i Graph readGraph(int n,int m,int indexed=1,bool directed=false,bool weighted=false){ Graph ret(n); for(int es = 0; es < m; es++){ int u,v; T w=1; cin>>u>>v;u-=indexed,v-=indexed; if(weighted)cin>>w; ret[u].emplace_back(v,w,es); if(!directed)ret[v].emplace_back(u,w,es); } return ret; } template Graph readParent(int n,int indexed=1,bool directed=true){ Graphret(n); for(int i=1;i>p; p-=indexed; ret[p].emplace_back(i); if(!directed)ret[i].emplace_back(p); } return ret; } template struct hash_map { using size_type = std::size_t; using key_type = Key; using value_type = Value; using pair_type = std::pair; enum class State: std::uint8_t { INACTIVE, ACTIVE, FILLED }; Hash hashf; std::vector st; std::vector bck; size_type mask; size_type prode; size_type sz; size_type min_elem; hash_map(): mask(0), prode(-1), sz(0), min_elem(0) { } size_type find_empty(const key_type& key) { size_type h = hashf(key); for(size_type delta = 0;;delta++) { size_type i = (h + delta) & mask; if(st[i] != State::FILLED) { if(prode < delta) prode = delta; return i; } } } size_type find_filled(const key_type& key) { if(sz == 0) return size_type(-1); size_type h = hashf(key); for(size_type delta = 0; delta <= prode; delta++) { size_type i = (h + delta) & mask; if(st[i] == State::FILLED) { if(bck[i].first == key) { return i; } } else if(st[i] == State::INACTIVE) { return size_type(-1); } } return size_type(-1); } size_type find_or_allocate(const key_type& key) { size_type h = hashf(key); size_type hole = size_type(-1); size_type delta = 0; for(; delta <= prode; delta++) { size_type i = (h + delta) & mask; if(st[i] == State::FILLED) { if(bck[i].first == key) return i; } else if(st[i] == State::INACTIVE) return i; else { if(hole == size_type(-1)) { hole = i; } } } if(hole != size_type(-1)) return hole; for(; ; delta++) { size_type i = (h + delta) & mask; if(st[i] != State::FILLED) { prode = delta; return i; } } } void reserve(int next_cnt) { size_type required_cnt = next_cnt + (next_cnt >> 1) + 1; if(required_cnt > bck.size()) { next_cnt = 4; while(next_cnt < required_cnt) next_cnt <<= 1; } else if(next_cnt <= bck.size() / 4) { next_cnt = std::max(4, (int)bck.size() / 2); } else { return; } std::vector old_st(next_cnt, State::INACTIVE); std::vector old_bck(next_cnt); std::swap(old_st, st); std::swap(old_bck, bck); mask = next_cnt - 1; sz = 0; prode = 0; min_elem = next_cnt - 1; for(size_type pos = 0; pos < old_bck.size(); pos++) { if(old_st[pos] == State::FILLED) { size_type i = find_empty(old_bck[pos].first); st[i] = State::FILLED; bck[i] = std::move(old_bck[pos]); min_elem = std::min(min_elem, i); sz += 1; } } } void insert(const key_type& key, const value_type& val) { reserve(sz + 1); size_type i = find_or_allocate(key); if(st[i] != State::FILLED) { st[i] = State::FILLED; bck[i] = pair_type(key, val); min_elem = std::min(min_elem, i); sz++; } else { bck[i] = pair_type(key, val); } } bool erase(const key_type& key) { size_type i = find_filled(key); if(i == size_type(-1)) { return false; } else { st[i] = State::ACTIVE; bck[i].~pair_type(); sz--; return true; } } pair_type* get(const key_type& key) { size_type i = find_filled(key); if(i == size_type(-1)) { return nullptr; } else { return &bck[i]; } } pair_type* get_or_insert(const key_type& key, const value_type val) { reserve(sz + 1); size_type i = find_or_allocate(key); if(st[i] != State::FILLED) { st[i] = State::FILLED; bck[i] = pair_type(key, val); min_elem = std::min(min_elem, i); sz++; } return &bck[i]; } pair_type get_and_erase(const key_type& key) { size_type i = find_filled(key); st[i] = State::ACTIVE; pair_type p = std::move(bck[i]); sz--; return p; } template void search_all(Func func) { for(size_type i = min_elem; i < bck.size(); i++) { if(st[i] == State::FILLED) { min_elem = i; size_type res = func(bck[i]); if(res & 0b10) { st[i] = State::ACTIVE; bck[i].~pair_type(); sz--; } if(res & 0b01) { return; } } } } size_type size() const { return sz; } }; struct Hashu32 { std::uint32_t operator()(std::uint32_t key) { int c2=0x27d4eb2d; // a prime or an odd constant key = (key ^ 61) ^ (key >> 16); key = key + (key << 3); key = key ^ (key >> 4); key = key * c2; key = key ^ (key >> 15); return key; } }; struct Hashu64 { std::size_t operator()(std::uint64_t key) { key = (~key) + (key << 18); // key = (key << 18) - key - 1; key = key ^ (key >> 31); key = key * 21; // key = (key + (key << 2)) + (key << 4); key = key ^ (key >> 11); key = key + (key << 6); key = key ^ (key >> 22); return (int) key; } }; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll res=0,buf=0; bool judge = true; int n,k;cin>>n>>k; vectorv; rep(i,1,10){ int c;cin>>c; rep(_,0,c)v.PB(i); } vector>mp(1<void{ if(num==0){ auto p=mp[bit].get_or_insert(rem%k,0); p->se++; return; } rep(i,0,n){ if(i>0&&v[i]==v[i-1]&&(~bit>>i-1&1))continue; f(f,num-1,rem*10+v[i],bit|1<void{ if(num==0){ auto p=mp[bit^mask].get((k-rem*mult%k)%k); if(p!=nullptr)res+=p->se; return; } rrep(i,0,n){ if(i>i+1&1))continue; f(f,num-1,rem*10+v[i],bit|1<