#include<bits/stdc++.h>
using namespace std;
#define int long long
#define LEN 1000005
#define mod 1000000007///best for mod kora
int base =10;
int power[LEN];
void init()///O(N)
{
power[0]=1;
for(int i=1;i<LEN;i++) power[i]=(power[i-1]*base)%mod;
}
void prefixHash(string s,vector<int> &ph)///O(N)
{
int sum=0;
for(int i=0;i<s.size();i++)
{
sum*=base;sum%=mod;
sum+=(s[i]-'0');sum%=mod;/// STRING THEKE INTEGER CONVERSION
ph[i]=sum;
}
cout<<sum<<endl;
for(auto x:ph)cout<<x<<" ";
cout<<endl;
}
int calcHash(int l,int r,string s,vector<int> &ph)///O(1)
{
if(l==0) return ph[r];
int tmp=(ph[r]-(ph[l-1]*power[r-l+1])%mod);
///return (((ph[r]-(ph[l-1]*power[r-l+1])%mod)%mod)+mod)%mod;////tiMe complexity O(1) THAKA LAGBE..AO AJONNO POWER ARRAY BANABO
if(tmp<0) return (tmp%mod)+mod;
else return tmp;
}
int32_t main()
{
init();///O(n)
string s="101245";
int n=s.size();
vector<int>ph(n);
int l=1,r=3;
//calcHash(l,r,s,ph);
prefixHash(s,ph);///SUM KORTESI AND STRING THEKE INT CONVERSION
cout<<endl;
cout<<calcHash(l,r,s,ph);
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCiNkZWZpbmUgTEVOIDEwMDAwMDUKI2RlZmluZSBtb2QgMTAwMDAwMDAwNy8vL2Jlc3QgZm9yIG1vZCBrb3JhCmludCBiYXNlID0xMDsKCmludCBwb3dlcltMRU5dOwoKdm9pZCBpbml0KCkvLy9PKE4pCnsKICAgIHBvd2VyWzBdPTE7CiAgICBmb3IoaW50IGk9MTtpPExFTjtpKyspIHBvd2VyW2ldPShwb3dlcltpLTFdKmJhc2UpJW1vZDsKfQp2b2lkIHByZWZpeEhhc2goc3RyaW5nIHMsdmVjdG9yPGludD4gJnBoKS8vL08oTikKewoKICAgIGludCBzdW09MDsKICAgIGZvcihpbnQgaT0wO2k8cy5zaXplKCk7aSsrKQogICAgewogICAgICAgIHN1bSo9YmFzZTtzdW0lPW1vZDsKICAgICAgICBzdW0rPShzW2ldLScwJyk7c3VtJT1tb2Q7Ly8vIFNUUklORyBUSEVLRSBJTlRFR0VSIENPTlZFUlNJT04KCiAgICAgICAgcGhbaV09c3VtOwogICAgfQogICAgY291dDw8c3VtPDxlbmRsOwogICAgZm9yKGF1dG8geDpwaCljb3V0PDx4PDwiICI7CiAgICBjb3V0PDxlbmRsOwoKfQppbnQgY2FsY0hhc2goaW50IGwsaW50IHIsc3RyaW5nIHMsdmVjdG9yPGludD4gJnBoKS8vL08oMSkKewogICAgaWYobD09MCkgcmV0dXJuIHBoW3JdOwogICAgaW50IHRtcD0ocGhbcl0tKHBoW2wtMV0qcG93ZXJbci1sKzFdKSVtb2QpOwogICAvLy9yZXR1cm4gKCgocGhbcl0tKHBoW2wtMV0qcG93ZXJbci1sKzFdKSVtb2QpJW1vZCkrbW9kKSVtb2Q7Ly8vL3RpTWUgY29tcGxleGl0eSBPKDEpIFRIQUtBIExBR0JFLi5BTyBBSk9OTk8gUE9XRVIgQVJSQVkgQkFOQUJPCiAgIGlmKHRtcDwwKSByZXR1cm4gKHRtcCVtb2QpK21vZDsKICAgZWxzZSByZXR1cm4gdG1wOwp9CmludDMyX3QgbWFpbigpCnsKICAgIGluaXQoKTsvLy9PKG4pCiAgICBzdHJpbmcgcz0iMTAxMjQ1IjsKICAgICAgICBpbnQgbj1zLnNpemUoKTsKICAgIHZlY3RvcjxpbnQ+cGgobik7CgogICAgaW50IGw9MSxyPTM7CiAgICAvL2NhbGNIYXNoKGwscixzLHBoKTsKICAgIHByZWZpeEhhc2gocyxwaCk7Ly8vU1VNIEtPUlRFU0kgQU5EIFNUUklORyBUSEVLRSBJTlQgQ09OVkVSU0lPTgogICAgICAgIGNvdXQ8PGVuZGw7CgogICAgY291dDw8Y2FsY0hhc2gobCxyLHMscGgpOwp9Cg==