#include using namespace std; typedef long long int uli; const int mx=1e5+10; const int mxt=(mx<<2); const uli mod=1e9+7; char s[mx]; struct node{ int d[26]; int lp; }; node st[mxt]; void mrg(node &a,node &b,node &c){//c=a+b for(int i=0;i<26;i++)c.d[i]=a.d[i]+b.d[i]; } void init(int u,int l,int r){ if(l==r){ for(int i=0;i<26;i++)st[u].d[i]=0; st[u].d[s[l]-'a']++; st[u].lp=0; } else{ int mid=(l+r)>>1; init(u+u+1,l,mid); init(u+u+2,mid+1,r); mrg(st[u+u+1],st[u+u+2],st[u]); } } int buf[26]; void shft(node &u,int x){ for(int i=0;i<26;i++)buf[(i+x)%26]=u.d[i]; for(int i=0;i<26;i++)u.d[i]=buf[i]; } void clr(int u,int l,int r){ if(l==r)return; int lp=st[u].lp; st[u+u+1].lp=(st[u+u+1].lp+lp)%26; st[u+u+2].lp=(st[u+u+2].lp+lp)%26; shft(st[u+u+1],lp); shft(st[u+u+2],lp); st[u].lp=0; } void upd(int u,int l,int r,int f,int t,int x){ if(r0)clr(u,l,r); if(f<=l && r<=t){ st[u].lp=x; shft(st[u],x); } else{ int mid=(l+r)>>1; upd(u+u+1,l,mid,f,t,x); upd(u+u+2,mid+1,r,f,t,x); mrg(st[u+u+1],st[u+u+2],st[u]); } } node qry(int u,int l,int r,int f,int t){ node ans; for(int i=0;i<26;i++)ans.d[i]=0; if(r0)clr(u,l,r); if(f<=l && r<=t)return st[u]; int mid=(l+r)>>1; node x=qry(u+u+1,l,mid,f,t); node y=qry(u+u+2,mid+1,r,f,t); mrg(x,y,ans); return ans; } uli pwr[mx]; uli inv[mx]; uli fxp(uli b,uli x){ uli a=1; for(;x!=0;b=b*b%mod,x>>=1) if(x&1ll)a=a*b%mod; return a; } int main(){ pwr[0]=inv[0]=1ll; for(int i=1;i