#include #define ALL(a) (a).begin(), (a).end() #define FOR(x,n) for(int x = 0; x < n; x++) #define SZ(a) ((int)(a).size()) using namespace std; typedef long long ll; typedef vector vi; int N, M; string s; const ll MOD = 1e9+7LL; const int MXN = 1e5 + 1; int t[4*MXN][26] = {}, LAZY[4*MXN] = {}, tmpA[26] = {}; void build(int n = 1, int l = 0, int r = N-1) { if(l==r) { t[n][s[l]-'a'] = 1; } else { int mid = (l+r)/2; build(2*n,l,mid); build(2*n+1,mid+1,r); FOR(x,26) t[n][x] = t[2*n][x] + t[2*n+1][x]; } } void push(int n, int l, int r) { if(LAZY[n] %= 26) { FOR(x,26) tmpA[x] = t[n][x]; FOR(x,26) t[n][x] = tmpA[(x-LAZY[n]+26)%26]; if(l != r) { LAZY[2*n] = (LAZY[2*n] + LAZY[n]) % 26; LAZY[2*n+1] = (LAZY[2*n+1] + LAZY[n]) % 26; } LAZY[n] = 0; } } void update(int a, int b, int m, int n=1, int l=0, int r=N-1) { push(n,l,r); if(l > b || r < a) return; else if(a <= l && r <= b) { LAZY[n] = (LAZY[n] + m)%26; } else { int mid = (l+r)/2; update(a,b,m,2*n,l,mid); update(a,b,m,2*n+1,mid+1,r); push(2*n,l,mid); push(2*n+1,mid+1,r); FOR(x,26) t[n][x] = t[2*n][x] + t[2*n+1][x]; } } vi query(int a, int b, int n=1, int l=0, int r=N-1) { push(n,l,r); if(l > b || r < a) return vi(26); else if(a <= l && r <= b) { vi tmp = vector(26); FOR(x,26) tmp[x] = t[n][x]; return tmp; } else { int mid = (l+r)/2; vi tmp1 = query(a,b,2*n,l,mid); vi tmp2 = query(a,b,2*n+1,mid+1,r); FOR(x,26) tmp1[x] += tmp2[x]; return tmp1; } } ll mm[MXN] = {}, mm2[MXN] = {}, facts[MXN], finv[MXN]; ll cmb(ll i, ll j) { return (((facts[i] * finv[j])%MOD) * finv[i-j])%MOD; } ll solve2(ll i) { if(mm[i] != -1) {return mm[i]; } mm[i] = 0; for(ll j = 0; j <= i; j+=2) { mm[i] = (mm[i] + cmb(i,j))%MOD; } return mm[i]; } ll solve3(ll i) { if(mm2[i] != -1) { return mm2[i]; } mm2[i] = 0; for(ll j = 1; j <= i; j+=2) mm2[i] = (mm2[i] + cmb(i,j))%MOD; return mm2[i]; } ll solve(int a, int b) { vi tmp = query(a,b); ll ans = 1, ones = 0; FOR(x,26) { ll tmp1 = solve3(tmp[x]); FOR(y,26) if(x != y) tmp1 = (tmp1 * solve2(tmp[y]))%MOD; ones = (ones + tmp1)%MOD; } FOR(x,26) ans = (ans * solve2(tmp[x]))%MOD; return (((ans-1+ones)%MOD)+MOD)%MOD; } ll fE(ll b, ll e) { ll r = 1; while(e) if(e&1) r=(r*b)%MOD,e--; else b=(b*b)%MOD, e/=2; return r; } int main() { finv[0] = facts[0] = 1; for(ll x = 1; x < MXN; x++) facts[x] = (facts[x-1] * x)%MOD, finv[x] = fE(facts[x],MOD-2); memset(mm,-1,sizeof mm); memset(mm2,-1,sizeof mm2); cin >> N >> M >> s; build(); FOR(x,M) { int type; cin >> type; if(type == 2) { int a, b; cin >> a >> b; cout << solve(a,b) << "\n"; } else { int a, b, m; cin >> a >> b >> m; update(a,b,m); } } }