#include using namespace std; typedef long long ll; typedef long double ld; typedef pair PP; // #define MOD 1000000007 #define MOD 998244353 #define INF 2305843009213693951 //#define INF 810114514 #define PI 3.141592653589 #define setdouble setprecision #define REP(i,n) for(ll i=0;i<(n);++i) #define OREP(i,n) for(ll i=1;i<=(n);++i) #define RREP(i,n) for(ll i=(n)-1;i>=0;--i) #define ORREP(i,n) for(ll i=(n);i>=1;--i) #define rep(i,a,b) for(ll i=(a);i<=(b);++i) #define ALL(v) (v).begin(), (v).end() #define GOODBYE do { cout << "-1" << endl; return 0; } while (false) #define MM <<" "<< #define Endl endl #define debug true #define debug2 false class rollinghash{ // Copyright (c) 2023 0214sh7 // https://github.com/0214sh7/library/ private: static constexpr long long mod = (1LL << 61)-1; std::vector Base = {12345,10000000}; std::vector BaseInv; std::vector> BaseInvExp; static constexpr long long h = 100; long long product(long long a,long long b){ static constexpr long long m = 1LL << 31; long long a1 = a/m,a2 = a%m; long long b1 = b/m,b2 = b%m; long long r = 0 , s; r = (r + 2*a1*b1) % mod; s = (a1*b2 + b1*a2) % mod; long long s1 = s/m,s2 = s%m; s = (2*s1+m*s2) % mod; r = (r + s) % mod; r = (r + a2*b2) % mod; return r; } long long power(long long b,long long e){ long long r=1; while(e){ if(e&1){ r=product(r,b)%mod; } b=product(b,b)%mod; e >>=1; } return r; } public: std::vector S; std::vector> H,Hsum; void init(std::vector cs){ S=cs; int n=S.size(); BaseInv.resize(Base.size()); BaseInvExp.resize(Base.size()); H.resize(Base.size()); Hsum.resize(Base.size()); for(int i=0;i<(int)Base.size();i++){ BaseInvExp[i].assign(n+1,1); H[i].assign(n+1,0); Hsum[i].assign(n+1,0); } //逆元 for(int i=0;i<(int)Base.size();i++){ BaseInv[i]=power(Base[i],mod-2); } for(int i=0;i<(int)Base.size();i++){ for(int j=0;j C){ init(C); } std::vector get(int l,int r){ std::vector R(Base.size()); for(int i=0;i<(int)Base.size();i++){ long long g = (Hsum[i][r]-Hsum[i][l]+mod)%mod; g=product(g,BaseInvExp[i][l]); R[i] = g; } return R; } std::vector instant(std::vector P){ std::vector R; for(int i=0;i<(int)Base.size();i++){ long long r = 0, b = 1; for(int j=0;j<(int)P.size();j++){ r = (r+product(b,P[j]+h))%mod; b = product(b,Base[i]); } R.push_back(r); } return R; } std::vector connect(std::vector P,long long ps,std::vector Q,long long qs){ std::vector R; for(int i=0;i<(int)Base.size();i++){ long long r = (product(Q[i],power(Base[i],ps))+P[i])%mod; R.push_back(r); } return R; assert(qs==qs); } }; ll Manacher(string _s){ int n = _s.size(); //'#'の追加 string s(2 * n + 1, '#'); for (int i = 0; i < n; i++) s[2 * i + 1] = _s[i]; n = 2 * n + 1; // cout << "? " << s << endl; vector rad(n); int c = 0, r = 0; while (c < n) { // cを中心に同じ文字がどこまで連続するか while (0 <= c - r && c + r < n && s[c - r] == s[c + r]) r++; rad[c] = r; //回文の長さに応じて利用可能な範囲を確認しつつメモ int k = 1; while (0 <= c - k && k + rad[c - k] < r) { rad[c + k] = rad[c - k]; k++; } //すでに計算が終わった分だけ中心と探索半径をずらす c += k; r -= k; } //'#'分の補正 // for (int i = 0; i < n; i++) { // if (i % 2 == 0) // rad[i] = (rad[i] - 1) / 2; // else // rad[i] /= 2; // } // REP(i,rad.size()){cout << rad[i] << " ";}cout << endl; ll Lmax = 0; REP(i,rad.size()){ if(i%2==0){ Lmax = max(Lmax,(ll)rad[i]-1); }else{ Lmax = max(Lmax,(ll)rad[i]-1); } } // cout << "! " << Lmax << endl; return Lmax; } void solve(){ ll N,X; cin >> N >> X; string S; cin >> S; vector Ss(N); REP(i,N){Ss[i] = S[i];} rollinghash rolS(Ss); reverse(ALL(Ss)); rollinghash rolR(Ss); // 1個のなかにあるか? ll L = Manacher(S); if(L >= X){ cout << 1 << endl; return; } // 2個のなかにあるか? string T = S+S; L = Manacher(T); if(L >= X){ cout << 2 << endl; return; } // 回文か? if(rolS.get(0,N)==rolR.get(0,N)){ cout << (X+N-1)/N << endl; return; } // 2-回文か? REP(i,N-1){ if(rolS.get(0,i+1)==rolR.get(N-i-1,N) && rolS.get(i+1,N)==rolR.get(0,N-i-1)){ ll c = max(i+1,N-i-1); ll Ans = 1, t = max(0ll,X-c); Ans += (t+N-1)/N; cout << Ans << endl; return; } } cout << -1 << endl; return; } int main(void){ //cin.tie(nullptr); //ios::sync_with_stdio(false); ll T; cin >> T; REP(_,T){solve();} return 0; }