Submission details
Task:Merkkijonot
Sender:Laakeri
Submission time:2025-11-08 13:40:16 +0200
Language:C++ (C++11)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED18
#2ACCEPTED19
#3ACCEPTED20
#4ACCEPTED21
#5ACCEPTED22
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3, 4, 5details
#2ACCEPTED0.03 s2, 3, 4, 5details
#3ACCEPTED0.00 s1, 2, 3, 4, 5details
#4ACCEPTED0.01 s1, 2, 3, 4, 5details
#5ACCEPTED0.01 s1, 2, 3, 4, 5details
#6ACCEPTED0.01 s1, 2, 3, 4, 5details
#7ACCEPTED0.00 s1, 2, 3, 4, 5details
#8ACCEPTED0.01 s1, 2, 3, 4, 5details
#9ACCEPTED0.01 s1, 2, 3, 4, 5details
#10ACCEPTED0.01 s1, 2, 3, 4, 5details
#11ACCEPTED0.01 s2, 3, 4, 5details
#12ACCEPTED0.12 s2, 3, 4, 5details
#13ACCEPTED0.14 s2, 3, 4, 5details
#14ACCEPTED0.14 s2, 3, 4, 5details
#15ACCEPTED0.00 s2, 3, 4, 5details
#16ACCEPTED0.18 s2, 3, 4, 5details
#17ACCEPTED0.04 s2, 3, 4, 5details
#18ACCEPTED0.11 s2, 3, 4, 5details
#19ACCEPTED0.01 s3, 4, 5details
#20ACCEPTED0.19 s3, 4, 5details
#21ACCEPTED0.17 s3, 4, 5details
#22ACCEPTED0.16 s3, 4, 5details
#23ACCEPTED0.00 s3, 4, 5details
#24ACCEPTED0.41 s3, 4, 5details
#25ACCEPTED0.04 s3, 4, 5details
#26ACCEPTED0.14 s3, 4, 5details
#27ACCEPTED0.01 s4, 5details
#28ACCEPTED0.17 s4, 5details
#29ACCEPTED0.24 s4, 5details
#30ACCEPTED0.20 s4, 5details
#31ACCEPTED0.01 s4, 5details
#32ACCEPTED0.65 s4, 5details
#33ACCEPTED0.04 s4, 5details
#34ACCEPTED0.18 s4, 5details
#35ACCEPTED0.01 s5details
#36ACCEPTED0.24 s5details
#37ACCEPTED0.27 s5details
#38ACCEPTED0.24 s5details
#39ACCEPTED0.00 s5details
#40ACCEPTED0.91 s5details
#41ACCEPTED0.05 s5details
#42ACCEPTED0.21 s5details

Code

#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long ll;

ll powmod(ll a, ll p, ll modd) {
	if (p==0) return 1;
	if (p%2==0) {
		a=powmod(a, p/2, modd);
		return (a*a)%modd;
	}
	return (a*powmod(a, p-1, modd))%modd;
}
ll invp(ll a, ll p) {
	return powmod(a, p - 2, p);
}
vector<ll> solve(vector<ll> S, ll mod) {
	vector<ll> C = {1};
	vector<ll> B = {1};
	ll L = 0;ll m = 1;ll b = 1;ll N = S.size();
	for (ll i = 0; i < N; i++) {
		ll d = S[i];
		for (ll j = 1; j <= L; j++) {
			d += C[j]*S[i - j];d %= mod;
		}
		if (d == 0) {
			m++;
		} else if (2*L <= i) {
			vector<ll> T = C;
			ll a = (invp(b, mod)*d)%mod;
			for (int j=0;j<i+1-2*L;j++) {
				C.push_back(0);
			}
			L=i+1-L;
			for (ll j = m; j <= L; j++) {
				C[j] -= a*B[j - m];C[j] %= mod;
			}
			B = T;b = d;m = 1;
		} else {
			ll a = (invp(b, mod)*d)%mod;
			for (ll j = m; j < m+(int)B.size(); j++) {
				C[j] -= a*B[j - m];C[j] %= mod;
			}
			m++;
		}
	}
	for (ll i = 0; i <= L; i++) {
		C[i] += mod;C[i] %= mod;
	}
	return C;
}
struct LinearRecurrence {
	vector<vector<ll> > mat;
	vector<ll> seq;
	ll mod;
	vector<vector<ll> > mul(vector<vector<ll> > a, vector<vector<ll> > b) {
		int n=(int)a.size();
		vector<vector<ll> > ret(n);
		for (int i=0;i<n;i++){
			ret[i].resize(n);
			for (int j=0;j<n;j++){
				ret[i][j]=0;
				for (int k=0;k<n;k++){
					ret[i][j]+=a[i][k]*b[k][j];
					ret[i][j]%=mod;
				}
			}
		}
		return ret;
	}
	vector<vector<ll> > pot(vector<vector<ll> > m, ll p) {
		if (p==1) return m;
		if (p%2==0) {
			m=pot(m, p/2);
			return mul(m, m);
		}
		else {
			return mul(m, pot(m, p-1));
		}
	}
	ll get(ll index) {
		if (index<(ll)mat.size()) {
			return seq[index];
		}
		vector<vector<ll> > a=pot(mat, index-(ll)mat.size()+1);
		ll v=0;
		for (int i=0;i<(int)mat.size();i++) {
			v+=a[0][i]*seq[(int)mat.size()-i-1];
			v%=mod;
		}
		return v;
	}
	LinearRecurrence(vector<ll> S, ll mod_) {
		seq=S;
		mod=mod_;
		vector<ll> C=solve(S, mod);
		int n=(int)C.size()-1;
		cerr<<"found "<<n<<endl;
		assert(n<=100);
		mat.resize(n);
		for (int i=0;i<n;i++) {
			mat[i].resize(n);
		}
		for (int i=0;i<n;i++) {
			mat[0][i]=(mod-C[i+1])%mod;
		}
		for (int i=1;i<n;i++) {
			mat[i][i-1]=1;
		}
	}
};


const ll mod=1e9+7;

int m;
string s;

ll go(ll t, char c){
	if (t==0) return 0;
	ll ne=0;
	if (c==s[0]) {
		ne|=2ll;
	}
	for (ll i=0;i<(ll)m;i++){
		if ( ( ( ((1ll<<i) + (1ll<<m)) & t) != 0) && s[i]==c){
			ne|=(1ll<<(i+1ll));
		}
	}
	return ne;
}

string bp(ll t, int bs){
	string r;
	for (ll i=0;i<(ll)bs;i++){
		if (t & (1ll<<i)){
			r+='1';
		} else {
			r+='0';
		}
	}
	return r;
}

map<ll,ll> dp[1010];

int main(){
	int n;
	cin>>n>>m>>s;
	if (m>n){
		cout<<0<<endl;
		return 0;
	}
	dp[0][1]=1;
	vector<ll> ans(1000-m);
	for (int i=0;i<1000;i++){
		for (auto tt : dp[i]){
			if (i>=m && (tt.F & (1ll<<m))){
				ans[i-m]+=tt.S;
				ans[i-m]%=mod;
			}

			for (char c='a';c<='z';c++){
				ll nt=go(tt.F, c);
				if (nt==0) continue;
				dp[i+1][nt] += tt.S;
				dp[i+1][nt]%=mod;
			}
		}
	}

	LinearRecurrence lr(ans, mod);
	if (n<1000){
		assert(ans[n-m] == lr.get(n-m));
	}
	cout<<lr.get(n-m)<<endl;
}

Test details

Test 1

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
1 1
a

correct output
1

user output
1

Error:
found 1

Test 2

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
20 20
ssxfykmuzljmwgyvldnu

correct output
1

user output
1

Error:
found 21

Test 3

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aaaaaaaaaa

correct output
1

user output
1

Error:
found 1

Test 4

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbbaaaab

correct output
1532

user output
1532

Error:
found 10

Test 5

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbacbdca

correct output
1542

user output
1542

Error:
found 11

Test 6

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
ztknszhrby

correct output
3261

user output
3261

Error:
found 10

Test 7

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 1
a

correct output
1

user output
1

Error:
found 1

Test 8

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
aabbbbbbba

correct output
1689

user output
1689

Error:
found 16

Test 9

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 8
abxabyab

correct output
8619

user output
8619

Error:
found 8

Test 10

Group: 1, 2, 3, 4, 5

Verdict: ACCEPTED

input
20 10
ababababab

correct output
509

user output
509

Error:
found 10

Test 11

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Error:
found 1

Test 12

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
bbaaabbbbbabbbbabababababbbaab...

correct output
511493117

user output
511493117

Error:
found 52

Test 13

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
addabbbbbadddccadcabaacbbbaabd...

correct output
618572722

user output
618572722

Error:
found 54

Test 14

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
rrdumiqrjewanjplbyvkaytbcyzbyl...

correct output
35126431

user output
35126431

Error:
found 52

Test 15

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 1
a

correct output
1

user output
1

Error:
found 1

Test 16

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
460606355

user output
460606355

Error:
found 96

Test 17

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 23
aybabtuxaybabtuyaybabtu

correct output
342213037

user output
342213037

Error:
found 24

Test 18

Group: 2, 3, 4, 5

Verdict: ACCEPTED

input
100 50
ababababababababababababababab...

correct output
775006564

user output
775006564

Error:
found 50

Test 19

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Error:
found 1

Test 20

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
bbabaabbabbbaaaaaaaaaababaabbb...

correct output
911592620

user output
911592620

Error:
found 59

Test 21

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
cacabdddcbdadabdcbdddbdddbaccb...

correct output
12869296

user output
12869296

Error:
found 55

Test 22

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
tqoyadbshyehwcwaxbtbsqtaswkyet...

correct output
741984969

user output
741984969

Error:
found 52

Test 23

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 1
a

correct output
1

user output
1

Error:
found 1

Test 24

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
599950419

user output
599950419

Error:
found 96

Test 25

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 23
aybabtuxaybabtuyaybabtu

correct output
548809016

user output
548809016

Error:
found 24

Test 26

Group: 3, 4, 5

Verdict: ACCEPTED

input
1000 50
ababababababababababababababab...

correct output
765799780

user output
765799780

Error:
found 50

Test 27

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Error:
found 1

Test 28

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
bbaababbaaabbabababbaaaaaabbaa...

correct output
514073453

user output
514073453

Error:
found 50

Test 29

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aabccabbbbabccabcdcdadbcdccdac...

correct output
438094288

user output
438094288

Error:
found 56

Test 30

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
yzfzimxrxfukhlkrtaylohyuqkupsn...

correct output
905445077

user output
905445077

Error:
found 52

Test 31

Group: 4, 5

Verdict: ACCEPTED

input
1000000 1
a

correct output
1

user output
1

Error:
found 1

Test 32

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
280596224

user output
280596224

Error:
found 96

Test 33

Group: 4, 5

Verdict: ACCEPTED

input
1000000 23
aybabtuxaybabtuyaybabtu

correct output
268144314

user output
268144314

Error:
found 24

Test 34

Group: 4, 5

Verdict: ACCEPTED

input
1000000 50
ababababababababababababababab...

correct output
655244665

user output
655244665

Error:
found 50

Test 35

Group: 5

Verdict: ACCEPTED

input
1000000000 50
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
1

user output
1

Error:
found 1

Test 36

Group: 5

Verdict: ACCEPTED

input
1000000000 50
abbbaabbaaaaabbbbabbabbaaaaaba...

correct output
911059863

user output
911059863

Error:
found 54

Test 37

Group: 5

Verdict: ACCEPTED

input
1000000000 50
cbabbcaadabbcabbdbdabbbcccbdca...

correct output
994268014

user output
994268014

Error:
found 54

Test 38

Group: 5

Verdict: ACCEPTED

input
1000000000 50
pehyicejeninplaczwezhahmbhwfwi...

correct output
837165971

user output
837165971

Error:
found 52

Test 39

Group: 5

Verdict: ACCEPTED

input
1000000000 1
a

correct output
1

user output
1

Error:
found 1

Test 40

Group: 5

Verdict: ACCEPTED

input
1000000000 50
aabbbbbbbbbbbbbbbbbbbbbbbbbbbb...

correct output
114333489

user output
114333489

Error:
found 96

Test 41

Group: 5

Verdict: ACCEPTED

input
1000000000 23
aybabtuxaybabtuyaybabtu

correct output
628064772

user output
628064772

Error:
found 24

Test 42

Group: 5

Verdict: ACCEPTED

input
1000000000 50
ababababababababababababababab...

correct output
802946327

user output
802946327

Error:
found 50