Go: ///
// File:  0546.go
// Author: ymiyamoto
//
// Created on Tue Mar  6 23:19:41 2018
//
package main

import (
	"fmt"
)

var n, k int

func perm(arr []int) [][]int {
	if len(arr) == 1 {
		return [][]int{arr}
	}

	p := perm(arr[1:])
	var ret [][]int
	for _, val := range p {
		for i := 0; i <= len(val); i++ {
			tmp := make([]int, len(val))
			copy(tmp, val)
			tmp = append(tmp, 0)
			copy(tmp[i+1:], tmp[i:])
			tmp[i] = arr[0]
			ret = append(ret, tmp)
		}
	}

	return ret
}

func permutation(n, k int) [][]int {
	ret := [][]int{}

	for i := 0; i < 1<<uint(n); i++ {
		var selects []int
		for j := 0; j < n; j++ {
			if (i>>uint(j))&1 == 1 {
				selects = append(selects, j)
			}
		}
		if len(selects) == k {
			ret = append(ret, perm(selects)...)
		}
	}

	return ret
}

func main() {
	for {
		fmt.Scan(&n, &k)
		if n == 0 && k == 0 {
			break
		}

		cards := make([]string, n)
		for i := 0; i < n; i++ {
			fmt.Scan(&cards[i])
		}

		ret := permutation(len(cards), k)
		nums := map[string]bool{}
		for _, val := range ret {
			var num string
			for i := 0; i < len(val); i++ {
				num += cards[val[i]]
			}
			nums[num] = true
		}

		fmt.Println(len(nums))
	}
}

C++: #include <iostream>
#include <vector>
#include <string>
#include <set>
#include <algorithm>
using namespace std;

set<string> ans;

const int MAX_N = 10;
// used[i] := base[i] を選んだかどうか
bool used[MAX_N];

// 初期化
void clear_used(){
	for(int i = 0 ; i < MAX_N ; i++ ) used[i] = false;
}

// baseの先頭から n 個の要素 から k 個選ぶ組合せの列挙
void comb(const vector<string>& base, vector<string> c, int pos,int last, int n, int k){
	if( pos == k ){
		// 組合せ c に対する操作
		sort( c.begin() , c.end() );
		do{
			string s;
			for(int i=0 ; i < c.size() ; i++ ){
				s += c[i];
			}
			string t;
			bool flag = false;
			for(int i=0 ; i < s.size() ; i++ ){
				if( s[i] >= '1' && s[i] <= '9' ){
					flag = true;
				}
				if( flag ) t.push_back( s[i] );
			}
			ans.insert( t );
		}while( next_permutation(c.begin(),c.end()) );
		return ;
	}
	for(int i = last+1 ; i < n ; i++ ){
		if( !used[i] ){
			c.push_back( base[i] );
			used[i] = true;
			comb( base , c , pos+1 , i , n , k );
			c.pop_back();
			used[i] = false;
		}
	}
}

int main(){
	int n, k;
	while( cin >> n >> k, n || k ){
		vector<string> a(n);
		ans.clear();
		
		for(int i=0 ; i < n ; i++ ){
			cin >> a[i];
		}
		
		clear_used();
		comb( a , vector<string>() , 0 , -1 , n , k );
		
		/*for(set<string>::iterator it = ans.begin() ; it != ans.end() ; ++it ){
			cout << *it << endl;
		}*/
		cout << ans.size() << endl;
	} 
}

C++: #define _CRT_SECURE_NO_WARNINGS
#include "bits/stdc++.h"
#include <random>

using namespace std;

//呪文
#define DUMPOUT cerr
#define dump(...) DUMPOUT<<"  ";DUMPOUT<<#__VA_ARGS__<<" :["<<__LINE__<<":"<<__FUNCTION__<<"]"<<endl;DUMPOUT<<"    ";dump_func(__VA_ARGS__)

typedef unsigned uint; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef pair<double, double> pdd; typedef pair<string, string> pss;
template <typename _KTy, typename _Ty> ostream& operator << (ostream& ostr, const pair<_KTy, _Ty>& m) { ostr << "{" << m.first << ", " << m.second << "}"; return ostr; }
template <typename _KTy, typename _Ty> ostream& operator << (ostream& ostr, const map<_KTy, _Ty>& m) { if (m.empty()) { ostr << "{ }"; return ostr; } ostr << "{" << *m.begin(); for (auto itr = ++m.begin(); itr != m.end(); itr++) { ostr << ", " << *itr; } ostr << "}"; return ostr; }
template <typename _Ty> ostream& operator << (ostream& ostr, const vector<_Ty>& v) { if (v.empty()) { ostr << "{ }"; return ostr; } ostr << "{" << v.front(); for (auto itr = ++v.begin(); itr != v.end(); itr++) { ostr << ", " << *itr; }	ostr << "}"; return ostr; }
template <typename _Ty> ostream& operator << (ostream& ostr, const set<_Ty>& s) { if (s.empty()) { ostr << "{ }"; return ostr; } ostr << "{" << *(s.begin()); for (auto itr = ++s.begin(); itr != s.end(); itr++) { ostr << ", " << *itr; }	ostr << "}"; return ostr; }
template <typename _Ty> ostream& operator << (ostream& ostr, const stack<_Ty>& s) { if (s.empty()) { ostr << "{ }"; return ostr; } stack<_Ty> t(s); ostr << "{" << t.top(); t.pop(); while (!t.empty()) { ostr << ", " << t.top(); t.pop(); } ostr << "}";	return ostr; }
template <typename _Ty> ostream& operator << (ostream& ostr, const list<_Ty>& l) { if (l.empty()) { ostr << "{ }"; return ostr; } ostr << "{" << l.front(); for (auto itr = ++l.begin(); itr != l.end(); ++itr) { ostr << ", " << *itr; } ostr << "}"; return ostr; }
template <typename _KTy, typename _Ty> istream& operator >> (istream& istr, pair<_KTy, _Ty>& m) { istr >> m.first >> m.second; return istr; }
template <typename _Ty> istream& operator >> (istream& istr, vector<_Ty>& v) { for (size_t i = 0; i < v.size(); i++) istr >> v[i]; return istr; }
namespace aux { // print tuple
	template<typename Ty, unsigned N, unsigned L> struct tp { static void print(ostream& os, const Ty& v) { os << get<N>(v) << ", "; tp<Ty, N + 1, L>::print(os, v); } };
	template<typename Ty, unsigned N> struct tp<Ty, N, N> { static void print(ostream& os, const Ty& value) { os << get<N>(value); } };
}
template<typename... Tys> ostream& operator<<(ostream& os, const tuple<Tys...>& t) { os << "{"; aux::tp<tuple<Tys...>, 0, sizeof...(Tys)-1>::print(os, t); os << "}"; return os; }

template<typename A, size_t N, typename T> inline void Fill(A(&array)[N], const T &val) { std::fill((T*)array, (T*)(array + N), val); }

void dump_func() { DUMPOUT << endl; }
template <class Head, class... Tail> void dump_func(Head&& head, Tail&&... tail) { DUMPOUT << head; if (sizeof...(Tail) == 0) { DUMPOUT << " "; } else { DUMPOUT << ", "; } dump_func(std::move(tail)...); }

#define PI 3.14159265358979323846
#define EPS 1e-11
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define fake false



//サイズ k の部分集合の列挙 a
template<typename Ty> Ty next_combination_bit(Ty n, Ty k) {
	Ty cnt = 0;
	Ty c = (1 << k) - 1;
	while (c < 1 << n) {
		cnt++;
		Ty x = c & -c, y = c + x;
		c = ((c & ~y) / x >> 1) | y;
	}
	return cnt;
}

int main()
{
	//clock_t start, end;
	//start = clock();

	cin.tie(0);
	ios::sync_with_stdio(false);

	while (true) {
		int n, k;
		cin >> n >> k;
		if (n == 0 && k == 0) break;

		vector<int> v(n);
		cin >> v;

		sort(all(v));

		set<string> st;

		int c = (1 << k) - 1;
		while (c < 1 << n) {

			vector<int> vv;
			for (int b = 0; b < n; b++) if ((c >> b) & 1) vv.push_back(v[b]);

			sort(all(vv));

			do {
				if (vv[0] == 0) continue;

				string s;
				for (int i = 0; i < k; i++) s += to_string(vv[i]);
				st.insert(s);

			} while (next_permutation(all(vv)));

			int x = c & -c, y = c + x;
			c = ((c & ~y) / x >> 1) | y;
		}

		cout << st.size() << endl;
	}

	//end = clock();
	//printf("%d msec.\n", end - start);

	return 0;
}