#include using namespace std; typedef long long li; typedef long long ll; #define mp make_pair #define pb push_back #define getc getchar #define mid (l+ r>> 1) #define ff first #define ss second #define ins insert const li mod= 1e9+ 7; li n, q; char ch[ 100005]; li s[ 100005]; li bn, bs; li block[ 1003][ 26]; void decompose() { bn= sqrt( n); bs= n/ bn; if( bn* bs< n) bn++; for( li i= 1; i<= bn; i++) { li lb= bs* (i- 1)+ 1, rb= min( n, bs* i); for( li j= lb; j<= rb; j++) block[ i][ s[ j] ]++; // for( li j= 0; j< 26; j++) printf( " %lld %lld\n", i, block[ i][ j]); } return; } li getBlock( li idx) { return idx/ bs+ (idx% bs== 0? 0: 1); } void shift( li blockNo, li times) { vector< li> newBlock( 26, 0); for( li i= 0; i< 26; i++) newBlock[ (i+ times)% 26]= block[ blockNo][ i]; for( li i= 0; i< 26; i++) block[ blockNo][ i]= newBlock[ i]; return; } void query1() { li l, r, times; scanf( "%lld %lld %lld", &l, &r, ×); l++; r++; times= times% 26; li lB= getBlock( l), rB= getBlock( r); for( li i= lB; i<= rB; i++) shift( i, times); return; } li dpOdd[ 26], dpEven[ 26]; void DP( vector< li> &hsh) { for( li i= 0; i< 26; i++) { li now= pow( 2, hsh[ i]- 1); dpEven[ i]= (now- 1)% mod; dpOdd[ i]= dpEven[ i]+ (i& 1? 0: 1); if( i== 0) continue; dpEven[ i]= (dpEven[ i]+ (dpEven[ i]* dpEven[ i- 1])% mod)% mod; dpOdd[ i]= (dpOdd[ i]+ ((dpOdd[ i]* dpEven[ i- 1])% mod+ (dpOdd[ i- 1]* dpEven[ i])% mod)% mod)% mod; dpEven[ i]= (dpEven[ i]+ dpEven[ i- 1])% mod; dpOdd[ i]= (dpOdd[ i]+ dpOdd[ i- 1])% mod; } li ans= (dpOdd[ 25]+ dpEven[ 25])% mod; printf( "%lld", ans); return; } void query2() { li l, r; scanf( "%lld %lld", &l, &r); l++; r++; li lB= getBlock( l), rB= getBlock( r); // printf( " %lld %lld\n", lB, rB); vector< li> hsh( 26, 0); for( li i= lB; i<= rB; i++) for( li j= 0; j< 26; j++) hsh[ j]+= block[ i][ j]; DP( hsh); return; } void solve() { scanf( "%lld %lld", &n, &q); scanf( "%s", ch); for( li i= 0; i< n; i++) s[ i+ 1]= ch[ i]- 'a'; decompose(); for( li i= 1; i<= q; i++) { li typ; scanf( "%lld", &typ); if( typ== 1) query1(); if( typ== 2) query2(); } return; } int main() { li T= 1; // scanf( "%ld", &T); while( T--) { solve(); } return 0; }