#include using namespace std; const int MOD = 1e9+7, N = 1e5+5; typedef long long ll; ll g[N][2]; void print(vector arr){ for(int i = 0; i < arr.size(); ++i) cout << arr[i] << " \n"[i==arr.size()-1]; } int check(vector arr){ int ans = 0; for(int i = 0; i < arr.size(); ++i) ans += arr[i]; return ans; } int f(vector cnt){ ll odd = 0, even = 1; for(int i = 0; i < 26; ++i){ odd = (odd*g[cnt[i]][0] + even*g[cnt[i]][1])%MOD; even = (even*g[cnt[i]][0])%MOD; } return ((odd+even-1)%MOD+MOD)%MOD; } string s; void add(vector &a, vector b){ for(int i = 0; i < 26; ++i) a[i] += b[i]; } struct seg{ seg *lc,*rc; int L,R,M,shift; vector cnt; seg(int l, int r):L(l),R(r){ lc = rc = NULL; M = (L+R)/2; shift = 0; cnt = vector(26); if(L < R){ lc = new seg(L,M); rc = new seg(M+1,R); upd(); } else{ cnt[s[l]-'a']++; } // cout << l << ' ' << r << ": "; print(cnt); } void upd(){ cnt = vector(26); lc->fix_lazy(); rc->fix_lazy(); add(cnt,lc->cnt); add(cnt,rc->cnt); assert(check(cnt)==R-L+1); } void fix_lazy(){ if(shift == 0) return; cnt.insert(cnt.end(),cnt.begin(),cnt.begin()+shift); cnt.erase(cnt.begin(),cnt.begin()+shift); if(lc!=NULL){ lc->shift += shift; if(lc->shift >= 26) lc->shift -= 26; rc->shift += shift; if(rc->shift >= 26) rc->shift -= 26; } shift = 0; } void change(int l, int r, int times){ fix_lazy(); if(l <= L && R <= r){ shift += times; if(shift >= 26) shift -= 26; fix_lazy(); return; } if(l <= M) lc -> change(l,r,times); if(r > M) rc -> change(l,r,times); upd(); } vector ask(int l, int r){ fix_lazy(); if(l <= L && R <= r){ return cnt; } vector ans(26); if(l <= M) add(ans,lc -> ask(l,r)); if(r > M) add(ans,rc -> ask(l,r)); return ans; } }; int main(){ g[0][0] = 1; for(int i = 1; i < N; ++i){ g[i][0] = (g[i-1][0] + g[i-1][1])%MOD; g[i][1] = (g[i-1][1] + g[i-1][0])%MOD; } int n,q; cin >> n >> q >> s; seg root(0,n-1); for(int i = 0; i < q; ++i){ int type,l,r,times; scanf("%d %d %d",&type,&l,&r); if(type == 1){ scanf("%d",×); times%=26; times = (26-times)%26; if(times != 0) root.change(l,r,times); } else{ vector cnt = root.ask(l,r); // print(cnt); // cout << l << ' ' << r << ": "; print(cnt); printf("%d\n",f(cnt)); } } }