//I_love_coding...
//I_will_win
//I_can_win
//I_must_win
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
long long int me(long long int x,long long int n,long long int M)
{//(__int128) when needed....
long long int result=1;
while(n>0)
{
if(n%2==1)
result=(result*x)%M;
x=(x*x)%M;
n=n/2;
}
return result;
}
//calculates : (1/(a^b))%M;
ll modInverse(ll A,ll B,ll M)
{
ll k=B*(M-2);
return me(A,k,M);
}
int main()
{
ios_base::sync_with_stdio(false) ;
cin.tie(NULL);
cout.tie(NULL);
string s;
cin>>s;
const int p = 31;
const int m = 1e9 + 9;
long long hash_value = 0;
int n = s.length();
int hash[n];
long long p_pow = 1;
int i=0;
for (char c : s)
{
hash_value = (hash_value + (c - 'a' + 1) * p_pow) % m;
p_pow = (p_pow * p) % m;
hash[i] = hash_value ;
cout<<hash[i]<<"\n";
i++;
}
int i1,j1;
//s[i1......j1]...
i1=2;
j1=4;
int ans = (hash[j1]%m -hash[i1-1]%m +m)%m;
int final = (modInverse(p,i1,m) * ans)%m ;
cout<<final ;
cout<<"\n";
i1=6;
j1=8;
ans = (hash[j1]%m -hash[i1-1]%m +m)%m;
final = (modInverse(p,i1,m) * ans)%m ;
cout<<final ;
return 0;
}
Ly9JX2xvdmVfY29kaW5nLi4uCi8vSV93aWxsX3dpbgovL0lfY2FuX3dpbgovL0lfbXVzdF93aW4KI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgaW50IGxsOwoKbG9uZyBsb25nIGludCBtZShsb25nIGxvbmcgaW50IHgsbG9uZyBsb25nIGludCBuLGxvbmcgbG9uZyBpbnQgTSkKey8vKF9faW50MTI4KSB3aGVuIG5lZWRlZC4uLi4KIGxvbmcgbG9uZyBpbnQgcmVzdWx0PTE7CiAgICB3aGlsZShuPjApCiAgICB7CiAgICAgICAgaWYobiUyPT0xKQogICAgICAgICAgICByZXN1bHQ9KHJlc3VsdCp4KSVNOyAgCiAgICAgICAgeD0oeCp4KSVNOwogICAgICAgIG49bi8yOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQoKCi8vY2FsY3VsYXRlcyA6ICgxLyhhXmIpKSVNOwpsbCBtb2RJbnZlcnNlKGxsIEEsbGwgQixsbCBNKQp7CiAgICBsbCBrPUIqKE0tMik7CiAgICByZXR1cm4gbWUoQSxrLE0pOwp9CgoKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKSA7IAoJY2luLnRpZShOVUxMKTsKICAgIGNvdXQudGllKE5VTEwpOwkKICAgIHN0cmluZyBzOwogICAgY2luPj5zOwogICAgY29uc3QgaW50IHAgPSAzMTsKICAgIGNvbnN0IGludCBtID0gMWU5ICsgOTsKICAgIGxvbmcgbG9uZyBoYXNoX3ZhbHVlID0gMDsKICAgIGludCBuID0gcy5sZW5ndGgoKTsKICAgIGludCBoYXNoW25dOwogICAgbG9uZyBsb25nIHBfcG93ID0gMTsKICAgIGludCBpPTA7CiAgICBmb3IgKGNoYXIgYyA6IHMpIAogICAgewogICAgICAgIGhhc2hfdmFsdWUgPSAoaGFzaF92YWx1ZSArIChjIC0gJ2EnICsgMSkgKiBwX3BvdykgJSBtOwogICAgICAgIHBfcG93ID0gKHBfcG93ICogcCkgJSBtOwogICAgICAgIGhhc2hbaV0gPSBoYXNoX3ZhbHVlIDsgCiAgICAgICAgY291dDw8aGFzaFtpXTw8IlxuIjsKICAgIGkrKzsKICAgIH0KICAgIGludCBpMSxqMTsKICAgIC8vc1tpMS4uLi4uLmoxXS4uLgogICAgaTE9MjsKICAgIGoxPTQ7CiAgICBpbnQgYW5zID0gKGhhc2hbajFdJW0gLWhhc2hbaTEtMV0lbSArbSklbTsKICAgIGludCBmaW5hbCA9IChtb2RJbnZlcnNlKHAsaTEsbSkgKiBhbnMpJW0gOyAgICAgCiAgICBjb3V0PDxmaW5hbCA7ICAgICAKICAgICAgICBjb3V0PDwiXG4iOwogICAgICAgIGkxPTY7CiAgICBqMT04OwogICAgIGFucyA9IChoYXNoW2oxXSVtIC1oYXNoW2kxLTFdJW0gK20pJW07CiAgICAgZmluYWwgPSAobW9kSW52ZXJzZShwLGkxLG0pICogYW5zKSVtIDsgICAgIAogICAgY291dDw8ZmluYWwgOwogICAgICAgIAogICAgICAgIAoJcmV0dXJuIDA7Cn0=