/*最大公约数性质
gcd(a,b)=gcd(b,a) (交换律)
gcd(-a,b)=gcd(a,b)
gcd(a,a)=|a|
gcd(a,0)=|a|
gcd(a,1)=1
gcd(a,b)=gcd(b, a mod b)
gcd(a,b)=gcd(b, a-b)
如果有附加的一个自然数m,
则: gcd(ma,mb)=m * gcd(a,b) (分配律)
gcd(a+mb ,b)=gcd(a,b)
如果m是a和b的最大公约数,
则: gcd(a/m ,b/m)=gcd(a,b)/m
在乘法函数中有:
gcd(ab,m)=gcd(a,m) * gcd(b,m)
两个整数的最大公约数主要有两种寻找方法:
* 两数各分解质因数,然后取出同样有的质因数乘起来
*辗转相除法(扩展版)
和最小公倍数(lcm)的关系:
gcd(a, b) * lcm(a, b) = ab
a与b有最大公约数,
两个整数的最大公因子可用于计算两数的最小公倍数,或分数化简成最简分数。
两个整数的最大公因子和最小公倍数中存在分配律:
* gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))
* lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))
在坐标里,将点(0, 0)和(a, b)连起来,通过整数坐标的点的数目(除了(0, 0)一点之外)就是gcd(a, b)。 */
const int maxn = 10000000 + 10;
const int maxp = 700000;
int vis[maxn]//vis[i] = 1,则i是合数,vis[i] = 0,则i是1或者素数
int prime[maxp];
//筛素数
void sieve(int n){
int m = (int)sqrt(n+0.5);//避免浮点误差
memset(vis,0,sizeof(vis));
for(int i = 2;i <= m;i++) if(!vis[i])
for(int j = i*i;j <= n;j+=i)vis[j]=1;
}
//生成素数表,放在prime数组中,返回素数个数
int gen_primes(int n){
sieve(n);
int c = 0;
for(int i = 2;i <= 2;i++) if(!vis[i])
prime[c++] = i;
return c;
}
//扩展欧几里得,注意求得的x,y对应|x| + |y| 的最小值
typedef long long ll;
ll gcd(ll a,ll b){
return b == 0 ? a : gcd(b,a%b);
}
void exgcd(ll a,ll b,ll& d,ll& x,ll& y){
if(!b){
d = a;
x = 1;
y = 0;
}
else{
exgcd(b,a%b,d,y,x);
y -= x*(a/b);
}
}
/*模运算法则
模数不能是0
(a+b)%n = ((a%n) + (b%n))%n
(a-b)%n = ((a%n) - (b%n) + n)%n
ab % n = (a % n)(b % n)%n
同余关系的自反、对称、传递。
若a≡c(mod p),b≡d(mod p), 则a+b≡c+d,a-b≡c-d,ab≡cd(mod p)
若ac≡bd,c≡d(mod p),且gcd(c,m)=1 则a≡b(mod p)*/
//快速乘快速幂
ll q_mul(ll a,ll b,ll mod){
ll ans = 0;
while(b){
if(b&1){
b--;
ans = (ans + a) % mod;
}
b/=2;
a = (a + a) % mod;
}
return ans;
}
ll q_pow(ll a,ll b,ll mod){
ll ans = 1;
while(b){
if(b&1){
ans = q_mul(ans,a,mod);
}
b/=2;
a = q_mul(a,a,mod);
}
return ans;
}
//欧拉phi函数
int phi[maxn];
void phi_table(int n){
for(int i = 2;i <= n;i++) phi[i] = 0;
phi[1] = 1;
for(int i = 2;i <= n;i++) if(!phi[i])
for(int j = i;j <= n;j+=i){
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i-1);
}
}
ll euler_phi(ll x){
ll m = (ll)sqrt(x+0.5);
ll ans = x;
for(int i = 2;i <= m;i++){
if(x % i == 0){
ans = ans / i * (i-1);
while(x % i == 0) x /= i;
}
}
if(x > 1) ans = ans / x * (x-1);
return ans;
}
//逆元
ll inv(ll a,ll n){
ll d,x,y;
gcd(a,n,d,x,y);
return d == 1 ? (x+n)%n : -1;
}
ll inv2(ll a,ll n){
return q_pow(a,n-2,n);
}
//中国剩余定理
//n个方程: x= a[i](mod m[i]) (0<=i<n)
ll china(int n,int* a,int* m){
ll M = 1,d,y,x = 0;
for(int i = 0;i < n;i++) M *= m[i];
for(int i = 0;i < n;i++){
ll w = M / m[i];
gcd(m[i],w,d,d,y);
x = (x + y*w*a[i]) % M;
}
return (x+M) % M;
}
//求解模方程a^x=b(mod n)。n为素数,无解时返回-1
int log_mod(int a,int b,int n){
int m,v,e=1,i;
m = (int)sqrt(n+0.5);
v = inv(q_pow(a,m,n),n);
map<int,int> x;
x[1] = 0;
for(int i = 1;i < m;i++){
e = q_mul(e,a,n);
if(!x.count(e)) x[e] = i;
}
for(i = 0;i < m;i++){
if(x.count(b)) return i*m + x[b];
b = q_mul(b,v,n);
}
return -1;
}
//高斯消元
typedef double Matrix[maxn][maxn];
void gauss_elimination(Matrix A,int n){
int i,j,k,r;
//消元过程
for(int i = 0;i < n;i++){
//选一行r并与第i行交换
r = i;
for(j = i+1;j < n;j++)
if(fabs(A[j][i]) > fabs(A[r][i])) r = j;
if(r != i) for(j = 0;j <= n;j++) swap(A[r][j],A[i][j]);
//与第i+!~n行进行消元
for(k = i+1,k < n;k++){
double f = A[k][i] / A[i][i];
for(j = i;j <= n;j++) A[k][j] -= f * A[i][j];
}
}
for(int i = n-1;i >= 0;i--){
for(j = i+1;j < n;j++)
A[i][n] -= A[j][n] * A[i][j];
A[i][n] /= A[i][i];
}
}
//秦九韶算法
int i = 1,v = a[n];
while(i <= n){
v = v*x + a[n-i];
i++;
}
ans = v;
//进制转换
//m转10
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main(){
int a[100];
int m,sum=0;
string n;
cin>>n>>m;
a[0]=n.size();
for(int i=1;i<=a[0];i++){
if(n[a[0]-i]>='0'&&n[a[0]-i]<='9')
sum=sum+pow(m,i-1)*(n[a[0]-i]-'0');
else
sum=sum+pow(m,i-1)*(n[a[0]-i]-'A'+10);
}
cout<<sum;
}
//10转m
int m,b;
char str[1000000];
void change_base(int n,int base,char *s){
if(n){
change_base(n/base,base,s);
s[strlen(s)]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%base];
}else return;
}
int main(){
cin >> m >> b;
change_base(m,b,str);
cout << str << endl;
return 0;
}
//高精度
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
const int P=10000,L=5000,W=4;
char s[L*W];
struct Big
{
int len;int data[L];bool fu;
void clear()
{
memset(data,0,sizeof(data));
len=0;fu=false;
}
int& operator [] (int k)
{
return data[k];
}
void operator = (int k)
{
clear();
if (k<0) fu=true,k=-k;else fu=false;
len=0;
while (k) data[++len]=k%P,k/=P;
if (len==0) len=1;
}
bool operator < (Big b)
{
bool t=false;
if (fu && !b.fu) return true;
if (!fu && b.fu) return false;
if (fu && b.fu) t=true;
if (len<b.len) return true^t;
if (len>b.len) return false^t;
for (int i=len;i;--i)
{
if (data[i]<b[i]) return true^t;
if (data[i]>b[i]) return false^t;
}
return false;
}
bool operator <= (Big b)
{
bool t=false;
if (fu && !b.fu) return true;
if (!fu && b.fu) return false;
if (fu && b.fu) t=true;
if (len<b.len) return true^t;
if (len>b.len) return false^t;
for (int i=len;i;--i)
{
if (data[i]<b[i]) return true^t;
if (data[i]>b[i]) return false^t;
}
return true;
}
bool operator > (Big b)
{
bool t=false;
if (fu && !b.fu) return false;
if (!fu && b.fu) return true;
if (fu && b.fu) t=true;
if (len<b.len) return false^t;
if (len>b.len) return true^t;
for (int i=len;i;--i)
{
if (data[i]<b[i]) return false^t;
if (data[i]>b[i]) return true^t;
}
return false;
}
bool operator >= (Big b)
{
bool t=false;
if (fu && !b.fu) return false;
if (!fu && b.fu) return true;
if (fu && b.fu) t=true;
if (len<b.len) return false^t;
if (len>b.len) return true^t;
for (int i=len;i;--i)
{
if (data[i]<b[i]) return false^t;
if (data[i]>b[i]) return true^t;
}
return true;
}
bool operator == (Big b)
{
if (fu!=b.fu) return false;
if (len<b.len) return false;
if (len>b.len) return false;
for (int i=len;i;--i)
if (data[i]!=b[i]) return false;
return true;
}
bool operator == (int k)
{
if (k<0)
{
if (!fu) return false;
k=-k;
} else if (fu) return false;
if (k>=P)
{
Big b;b=k;
return *this==b;
}
else return len==1 && data[1]==k;
}
bool operator != (Big b)
{
if (fu!=b.fu) return true;
if (len<b.len) return true;
if (len>b.len) return true;
for (int i=len;i;--i)
if (data[i]!=b[i]) return true;
return false;
}
bool operator != (int k)
{
if (k<0)
{
if (!fu) return true;
k=-k;
} else if (fu) return true;
if (k>=P)
{
Big b;b=k;
return *this!=b;
}
else return !(len==1 && data[1]==k);
}
Big operator + (Big b)
{
Big a=*this,c;c.clear();
if (a.fu && b.fu)
{
a.fu=false;b.fu=false;c=a+b;
if (c.len!=1 || c[1]!=0) c.fu=true;
return c;
}
if (a.fu && !b.fu)
{a.fu=false;return b-a;}
if (!a.fu && b.fu)
{b.fu=false;return a-b;}
a.len=max(a.len,b.len);
for (int i=1;i<=a.len;++i)
{
a[i+1]+=(a[i]+b[i])/P;
a[i]=(a[i]+b[i])%P;
}
if (a[a.len+1]) ++a.len;
while (a[a.len]==0 && a.len>1) --a.len;
return a;
}
Big operator + (int k)
{
Big a=*this,b;b=k;
return a+b;
}
Big operator - (Big b)
{
Big a=*this,c;c.clear();
if (a.fu && !b.fu)
{
a.fu=false;b.fu=false;c=a+b;
if (c.len!=1 || c[1]!=0) c.fu=true;
return c;
}
if (a.fu && b.fu)
{
a.fu=false;b.fu=false;return b-a;
}
if (!a.fu && b.fu)
{
b.fu=false; return a+b;
}
if (a<b) swap(a,b),a.fu=true;else a.fu=false;
for (int i=1;i<=a.len;++i)
{
if (a[i]<b[i]) a[i]+=P,--a[i+1];
a[i]-=b[i];
}
while (a[a.len]==0 && a.len>1) --a.len;
if (a.len==1 && a[1]==0) a.fu=false;
return a;
}
Big operator - (int k)
{
Big a=*this,b;b=k;
return a-b;
}
Big operator * (Big b)
{
Big c;c.clear();
c.len=len+b.len-1;
for (int i=1;i<=len;++i)
for (int j=1;j<=b.len;++j)
{
c[i+j-1]+=data[i]*b[j];
c[i+j]+=c[i+j-1]/P;
c[i+j-1]%=P;
}
if (c[c.len+1]) ++c.len;
while (c[c.len]==0 && c.len>1) --c.len;
c.fu=fu^b.fu;
if (c.len==1 && c[1]==0) c.fu=false;
return c;
}
Big operator * (int k)
{
Big a=*this;
if (k<0) a.fu=!a.fu,k=-k;
if (k>=P)
{
Big b;b=k;
return a*b;
}
for (int i=1;i<=a.len;++i) a[i]*=k;
for (int i=1;i<=a.len;++i)
a[i+1]+=a[i]/P,a[i]%=P;
while (a[a.len+1])
{
++a.len;
a[a.len+1]=a[a.len]/P;
a[a.len]%=P;
}
while (a[a.len]==0 && a.len>1) --a.len;
if (a.len==1 && a[1]==0) a.fu=false;
return a;
}
Big operator / (int k)
{
Big a=*this;int g=0;
if (k<0) a.fu=!a.fu,k=-k;
for (int i=a.len;i;--i)
{
a[i]+=g*P;
g=a[i]%k;
a[i]/=k;
}
while (a[a.len]==0 && a.len>1) --a.len;
if (a.len==1 && a[1]==0) a.fu=false;
return a;
}
Big operator % (int k)
{
Big b;b=k;
return *this%b;
}
Big operator / (Big b)
{
Big c,d;c=0;d=0;c.fu=fu^b.fu;b.fu=false;
for (int i=len;i;--i)
{
d=d*P+data[i];
int ans=0,l=0,r=P-1;
while (l<=r)
{
int mid=(l+r)>>1;
if (b*mid<=d) ans=mid,l=mid+1;
else r=mid-1;
}
c[i]=ans;
d=d-b*c[i];
}
c.len=len;
while (c[c.len]==0 && c.len>1) --c.len;
return c;
}
Big operator % (Big b)
{
Big c,d;c=0;d=0;c.fu=fu^b.fu;b.fu=false;
for (int i=len;i;--i)
{
d=d*P+data[i];
int ans=0,l=0,r=P-1;
while (l<=r)
{
int mid=(l+r)>>1;
if (b*mid<=d) ans=mid,l=mid+1;
else r=mid-1;
}
c[i]=ans;
d=d-b*c[i];
}
c.len=len;
while (c[c.len]==0 && c.len>1) --c.len;
d=*this-b*c;
return d;
}
Big operator ^ (int t)
{
Big a=*this,ans;ans=1;
while (t)
{
if (t&1) ans=ans*a;t>>=1;a=a*a;
}
return ans;
}
void read()
{
scanf("%s",s);
clear();
len=1;
int pow=1,t=1,l=strlen(s),stop=0;
if (s[0]=='-') fu=true,stop=1;
for (int i=l-1;i>=stop;--i)
{
if (t>W) t=pow=1,++len;
data[len]+=pow*(s[i]-'0');
++t,pow*=10;
}
}
void write()
{
if (fu) printf("%c",'-');
printf("%d",data[len]);
for (int i=len-1;i;--i)
{
if (data[i]<10) putchar('0');
if (data[i]<100) putchar('0');
if (data[i]<1000) putchar('0');
printf("%d",data[i]);
}
}
void writeln()
{
write();printf("\n");
}
} ;
Big ans,tmp;
int main(){
ans.read();
tmp = ans;
ans = ans * 333;
tmp.writeln();
return 0;
}
//miller rabin判素
typedef unsigned long long LL;
LL modular_multi(LL x,LL y,LL mo)
{
LL t;
x%=mo;
for(t=0;y;x=(x<<1)%mo,y>>=1)
if (y&1)
t=(t+x)%mo;
return t;
}
LL modular_exp(LL num,LL t,LL mo)
{
LL ret=1,temp=num%mo;
for(;t;t>>=1,temp=modular_multi(temp,temp,mo))
if (t&1)
ret=modular_multi(ret,temp,mo);
return ret;
}
bool miller_rabbin(LL n)
{
if (n==2)return true;
if (n<2||!(n&1))return false;
int t=0;
LL a,x,y,u=n-1;
while((u&1)==0) t++,u>>=1;
for(int i=0;i<S;i++)
{
a=rand()%(n-1)+1;
x=modular_exp(a,u,n);
for(int j=0;j<t;j++)
{
y=modular_multi(x,x,n);
if (y==1&&x!=1&&x!=n-1)
return false;
///其中用到定理,如果对模n存在1的非平凡平方根,则n是合数。
///如果一个数x满足方程x^2≡1 (mod n),但x不等于对模n来说1的两个‘平凡’平方根:1或-1,则x是对模n来说1的非平凡平方根
x=y;
}
if (x!=1)///根据费马小定理,若n是素数,有a^(n-1)≡1(mod n).因此n不可能是素数
return false;
}
return true;
}
//分解质因数
#include<stdio.h>
#include<math.h>
int main()
{
int n,i;
while(scanf("%d",&n)&&n)
{
for(i=2;i<=sqrt(n);i++)
if(n%i==0&&(n/=i))
printf("%d ",i--);
printf("%d/n",n);
}
return 0;
}
//斐波那契数列
int Fibonacci1(int n){ return n<=1?n:Fibonacci1(n-2)+Fibonacci1(n-1);}
//组合数
//不取模
int Factorial(int n){ return !n?1:n*Factorial(n-1);}
int Permutation(int n,int m){ return Factorial(n)/Factorial(n-m);}
int Combination(int n,int m){ return Permutation(n,m)/Factorial(m);}
int Repeated_Combination(int n,int m){ return Combination(n+m-1,m);}
//取模
short c[1001][1001];
for (short i = 1; i <= 1000; i++)
{
c[i][i] = c[i][0] = 1;
c[i][1] = c[i][i-1] = i;
}
for (short i = 2; i <= 1000; i++)
{
for (short j = 2; j < i; j++)
{
c[i][j] = (c[i-1][j-1] + c[i-1][j]) % 10007;
}
}
//卢卡斯定理
/*C(n,m)%p=C(n%p,m%p)*C(n\p,m\p)
其中C(n\p,m\p)可以递归求解。
计算C(n%p,m%p),可先预处理出1!%p~(p-1)!%p,然后根据数据,考虑是同时预处理出1!的逆元、2!的逆元.....(p-1)!的逆元还是每次lucas算一遍逆元,x的逆元*y的逆元=x*y的逆元。逆元也可以线性筛(其实是近似线性),即用近似O(n)的时间求出1的逆元、2的逆元...(p-1)的逆元,然后阶乘的逆元=逆元的阶乘,即(p-1)!的逆元=1的逆元*2的逆元*....*(p-1)的逆元。
注意,在计算C时,若n<m则返回0,若m=0则返回1*/
void init()
{
int i;
fac[0] =1;
for(i =1; i <= p; i++)
fac[i] = fac[i-1]*i % p;
}
long long C(long long n, long long m)
{
if(m > n) return 0;
return fac[n]*pow(fac[m]*fac[n-m], p-2) % p;
}
long long Lucas(long long n, long long m)
{
if(m ==0) return 1;
else return (C(n%p, m%p)*Lucas(n/p, m/p))%p;
}
//二项式定理
int Binomial_theorem(int n,int m){return Combination(m,n);}
//卡特兰数
/*
令h(0)=1,h(1)=1,catalan数满足递推式[1]:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式[2] :
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)
*/
int Catalan(int n){ return Combination(2*n,n)/(n+1);}
//汉诺塔
int Hanoi_number(int n){ return n==1?2:2*Hanoi_number(n-1)+2;}