#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e6+5;
LL l,r;
LL cnt[N],num[N];
void init(){
	for(int i=2;i<=N;i++)
	 for(int j=i;j<=r;j+=i){
	 	if(j<l)continue;
	 	cnt[i]++;
	 }
}
int main(){
	cin>>l>>r;
	init();
	LL ans=0;
	for(int i=r;i>=2;i--){
		num[i]=cnt[i]*cnt[i];
		for(int j=i+i;j<=r;j+=i){
			num[i]-=num[j];
		}
		ans+=num[i];
		if(i>=l)ans-=cnt[i]*2-1;
	}
	cout<<ans;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#include <math.h>
#include <iomanip>
#include <cstdint>
#include <string>
#include <sstream>

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
#define rep(i,n) for (int i = 0; i < (n); ++i)
typedef long long ll;
using P = pair<int,int>;

const int INF=1001001001;
const int mod =998244353;

struct mint {
  ll x; 
  mint(ll x=0):x((x%mod+mod)%mod){}
  mint operator-() const { return mint(-x);}
  mint& operator+=(const mint a) {
    if ((x += a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator-=(const mint a) {
    if ((x += mod-a.x) >= mod) x -= mod;
    return *this;
  }
  mint& operator*=(const mint a) { (x *= a.x) %= mod; return *this;}
  mint operator+(const mint a) const { return mint(*this) += a;}
  mint operator-(const mint a) const { return mint(*this) -= a;}
  mint operator*(const mint a) const { return mint(*this) *= a;}
  mint pow(ll t) const {
    if (!t) return 1;
    mint a = pow(t>>1);
    a *= a;
    if (t&1) a *= *this;
    return a;
  }
   
  mint inv() const { return pow(mod-2);}
  mint& operator/=(const mint a) { return *this *= a.inv();}
  mint operator/(const mint a) const { return mint(*this) /= a;}
 };
  istream& operator>>(istream& is, const mint& a) { return is >> a.x;}
  ostream& operator<<(ostream& os, const mint& a) { return os << a.x;}
  struct combination {
  vector<mint> fact, ifact;
  combination(int n):fact(n+1),ifact(n+1) {
    assert(n < mod);
    fact[0] = 1;
    for (int i = 1; i <= n; ++i) fact[i] = fact[i-1]*i;
    ifact[n] = fact[n].inv();
    for (int i = n; i >= 1; --i) ifact[i-1] = ifact[i]*i;
  }
  mint operator()(int n, int k) {
    if (k < 0 || k > n) return 0;
    return fact[n]*ifact[k]*ifact[n-k];
  }
 } c(200005);

int main() {
  ll N,K;
  cin>>N>>K;
  vector<mint>A(N);
  rep(i,N){
    int a;
    cin>>a;
    A[i]=a;
  }
  vector<mint>sum(K+1);
  rep(i,N){
    mint ki=1;
    rep(k,K+1){
      sum[k]=(sum[k]+ki);
      ki=ki*A[i];
    }
  }
  for(int x=1;x<=K;x++){
    mint ans=0;
    rep(k,x+1){
      ans+=c(x,k)*sum[k]*sum[x-k];
    }
    mint p=mint(2).pow(x)*sum[x];
    cout<<(ans-p)/2<<endl;
  }
  return 0;
}
  