#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using ld = long double;

#define all(x)  x.begin(),x.end()
#define v(x) vector<x>
#define nl '\n'
#define fxd(x) fixed << setprecision(x)
template<class t> using ordered_set = tree<t, null_type, less<t>, rb_tree_tag, tree_order_statistics_node_update>;
template<class t> using ordered_multiset = tree<t, null_type, less_equal<t>, rb_tree_tag, tree_order_statistics_node_update>;

vector<bool> nums(1000005,true);
ll sz = nums.size()-1;
void sieve()
{
    nums[0] = false;
    nums[1] = false;
    for (ll i = 2; i < nums.size(); i++)
    {
        if(nums[i])
        {
            for (ll j = i*i; j < sz; j+=i)
            {
                nums[j] = false;
            }
            
        }
    }
    return;
}

bool feared(ll n)
{
    while(n)
    {
        if(n%10 == 0)
        {
            return false;
        }
        n/=10;
    }
    return true;
}

bool alltruncates(ll n)
{
    ll p = log10(n);
    while (p--)
    {
        if(!nums[n%(ll)pow(10,p+1)]) return false;
    }
    return true;
}

int main()
{
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    sieve();
    int t; cin >> t;
    v(ll) pref(sz,0);
    for (int i = 1; i < sz; i++)
    {
        if(nums[i] && feared(i) && alltruncates(i)) pref[i]++;
        pref[i] = pref[i-1] + pref[i];
    }
    while (t--)
    {
        ll n; cin >> n;
        cout << pref[n] << nl;
    }
}