#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> v;
ll power(ll a, ll n,ll m){
if(n==0)
return 1;
if(n%2==0){
return power((a%m*a%m)%m,n/2,m);
}
return (a%m*power((a%m*a%m)%m,n/2,m))%m;
}
ll modInverse(ll a, ll m)
{
ll m0 = m;
ll y = 0, x = 1;
if (m == 1)
return 0;
while (a > 1)
{
ll q = a / m;
ll t = m;
m = a % m, a = t;
t = y;
y = x - q * y;
x = t;
}
if (x < 0)
x += m0;
return x;
}
int main() {
int* b=new int[100010];
for(int i=0;i<100010;i++){
b[i]=1;
}
b[0]=0;
b[1]=0;
for(int i=2;i<1000;i++){
for(int j=i*i;j<100010;j+=i){
b[j]=0;
}
}
for(int i=0;i<100010;i++){
if(b[i]==1)
v.push_back(i);
}
srand (time(NULL));
ll prime1 = v[(rand() % v.size())];
ll prime2 = v[(rand() % v.size())];
ll prime = prime1*prime2;
ll euler =((prime1-1)*(prime2-1));
ll p=v.size();
ll index;
while(1){
index = rand() % p;
if(v[index]<euler)
break;
else
p=index;
}
ll encry= v[index];
ll decry =modInverse(encry, euler);
cout<<decry<<endl;
string s;
getline(cin,s);
for(int i=0;i<s.length();i++){
int p =int(s[i]-'a');
ll j=power(p,encry,prime);
ll l=power(j,decry,prime);
cout<<p<<" " <<j<<" "<<char(j)<<" "<<l<<endl;
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKdmVjdG9yPGxsPiB2OwoKbGwgcG93ZXIobGwgYSwgbGwgbixsbCBtKXsKCQoJaWYobj09MCkKCSAgcmV0dXJuIDE7CgkgIAoJICBpZihuJTI9PTApewoJICAgICByZXR1cm4JcG93ZXIoKGElbSphJW0pJW0sbi8yLG0pOwoJICB9CgkKCSByZXR1cm4gKGElbSpwb3dlcigoYSVtKmElbSklbSxuLzIsbSkpJW07CgkKCQoJCgkKCQp9CgpsbCBtb2RJbnZlcnNlKGxsIGEsIGxsIG0pCnsKICAgIGxsIG0wID0gbTsKICAgIGxsIHkgPSAwLCB4ID0gMTsKIAogICAgaWYgKG0gPT0gMSkKICAgICAgcmV0dXJuIDA7CiAKICAgIHdoaWxlIChhID4gMSkKICAgIHsKICAgICAgICAKICAgICAgICBsbCBxID0gYSAvIG07CiAgICAgICAgbGwgdCA9IG07CiAKICAgICAgICAKICAgICAgICBtID0gYSAlIG0sIGEgPSB0OwogICAgICAgIHQgPSB5OwogCiAgICAgICAgCiAgICAgICAgeSA9IHggLSBxICogeTsKICAgICAgICB4ID0gdDsKICAgIH0KIAogICAgCiAgICBpZiAoeCA8IDApCiAgICAgICB4ICs9IG0wOwogCiAgICByZXR1cm4geDsKfQogCgppbnQgbWFpbigpIHsKCWludCogYj1uZXcgaW50WzEwMDAxMF07CiAgICBmb3IoaW50IGk9MDtpPDEwMDAxMDtpKyspewogICAgCWJbaV09MTsKICAgIH0KICAgIGJbMF09MDsKICAgIGJbMV09MDsKICAgIGZvcihpbnQgaT0yO2k8MTAwMDtpKyspewogICAgCWZvcihpbnQgaj1pKmk7ajwxMDAwMTA7ais9aSl7CiAgICAJCWJbal09MDsKICAgIAl9CiAgICB9CgkKCSBmb3IoaW50IGk9MDtpPDEwMDAxMDtpKyspewogICAgCWlmKGJbaV09PTEpCiAgICAJICB2LnB1c2hfYmFjayhpKTsKICAgIH0KICBzcmFuZCAodGltZShOVUxMKSk7CQogIGxsIHByaW1lMSA9IHZbKHJhbmQoKSAlIHYuc2l6ZSgpKV07CiAgbGwgcHJpbWUyID0gdlsocmFuZCgpICUgdi5zaXplKCkpXTsKICBsbCBwcmltZSA9IHByaW1lMSpwcmltZTI7CiAgbGwgZXVsZXIgPSgocHJpbWUxLTEpKihwcmltZTItMSkpOwogIGxsIHA9di5zaXplKCk7CiAgbGwgaW5kZXg7CiAgd2hpbGUoMSl7CiAgICAgICAgaW5kZXggPSByYW5kKCkgJSBwOwogICAgICAgaWYodltpbmRleF08ZXVsZXIpCiAgICAgICAgYnJlYWs7CiAgICAgICAgCiAgICAgICAgZWxzZQogICAgICAgICAgcD1pbmRleDsKfQogIGxsIGVuY3J5PSB2W2luZGV4XTsKICBsbCBkZWNyeSA9bW9kSW52ZXJzZShlbmNyeSwgZXVsZXIpOwogIGNvdXQ8PGRlY3J5PDxlbmRsOwogIHN0cmluZyBzOwogIGdldGxpbmUoY2luLHMpOwogIGZvcihpbnQgaT0wO2k8cy5sZW5ndGgoKTtpKyspewogIAlpbnQgcCA9aW50KHNbaV0tJ2EnKTsKICAJbGwgaj1wb3dlcihwLGVuY3J5LHByaW1lKTsKICAJbGwgbD1wb3dlcihqLGRlY3J5LHByaW1lKTsKICAKICAgICAgICAgICAgCiAgCWNvdXQ8PHA8PCIgICIgPDxqPDwiICAgIjw8Y2hhcihqKTw8IiAgICI8PGw8PGVuZGw7CiAgCQogIH0KCiAgCiAgCn0=