#include <bits/stdc++.h>
/* S.size() s.substr(l,r=s.size()-l) -> l文字目からr文字分
__gcd()　lower_bound(a+l,a+r,x)-a でindex
// 配列  -> min/max({}) 
// vector-> *min_element(a+l,a+r)  *忘れず lとrで[l,r) 
//reverse(a+l,a+r)   配列aの[l,r)を逆順に strはreverse(all(s))
//sort(a+l,a+r,greater <int>()) 配列aの[l,r)昇順sort,大きい順はgreater<type>()
//vectorならall(v)
clock()/CLOCKS_PER_SEC で秒数
vector v.push_back(x),v.pop_back()
q.push(x),front()で先頭を返す,pop()で削除, size(),empty()
<deque>(push/pop)_(front/back)/fornt/back/insert/
priority_queue 宣言は priority_queue< Type, vector<Type>, greater<Type>> Q1; 
// pq.push(x),top()で参照 pop()で削除   greaterで最小 lessで最大がtopに*/
using namespace std;
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)
#define repl(i, s, n) for (ll i = (s); i < (ll)(n); i++)
#define rrep(i,n) for(int (i)=(n)-1;(i)!=-1;(i)--)
#define vep(i,v) for(auto (i)=v.begin();(i)<(v.end());(i)++)
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
inline long long ceildiv(long long a, long long  b) { return (a+b-1)/b; }

const long long inf = 10e17;

//int |x|<=2*10**9     long |x|<= 9*10**18
//printf(".(小数点以下の桁数)lf(double時、float ならf)")
#define ll long long
#define print(i) std::cout << (i) << '\n'
typedef  vector<ll> vec;
typedef vector<vec> mat ;
const ll mod =1000000007;
vec mul(vec &A,vec &B){
    vec ret(A.size(),0ll);
    int n=A.size();
    rep(i,n){
      rep(j,n){
        ret[(i+j)%n]=(ret[(i+j)%n]+A[i]*B[j]%mod)%mod;
      }
    }
    return ret;
}
vec pow(vec A,ll n){
    vec ret(A.size(),0ll);
    ret[0]=1ll;
    while(n>0ll){
        if(n&1ll)ret=mul(ret,A);
        A=mul(A,A);
        n>>=1ll;
    }
    return ret;
}
int main(){
int n,m;
ll k;
cin>>n>>m>>k;
vec a(n,0ll);
a[0]++;
rep(b,m){
    int p;
    cin>>p;
    p%=n;
    a[p]++;
}

vec V=pow(a,k);
rep(i,n){
    cout<<V[i]<<endl;
}
}

