该模板来自于吉林大学ACM模板库
#include<iostream>
using namespace std;
const int base = 10000;
const int width = 4;
const int N = 1000;
struct bint{
int ln,v[N];
bint(int r=0){
for(ln = 0;r>0;r/=base)v[ln++] = r%base;
}
bint operator = (const bint &r){
memcpy(this,&r,(r.ln+1)*sizeof(int));
return *this;
}
};
bool operator < (const bint &a,const bint &b){
int i;
if(a.ln!=b.ln)return a.ln<b.ln;
for(i=a.ln-1;i>=0&&a.v[i]==b.v[i];i--);
return i<0?0:a.v[i]<b.v[i];
}
bool operator <= (const bint& a,const bint& b){
return !(b<a);
}
bint operator + (const bint &a, const bint &b){
bint res;int i,cy=0;
for(i=0;i<a.ln||i<b.ln||cy>0;i++){
if(i<a.ln)cy+=a.v[i];
if(i<b.ln)cy+=b.v[i];
res.v[i] = cy%base; cy/=base;
}
res.ln = i;
return res;
}
bint operator - (const bint &a,const bint &b){
bint res;int i,cy=0;
for(res.ln=a.ln,i=0;i<res.ln;i++){
res.v[i] = a.v[i]-cy;
if(i<b.ln)res.v[i]-=b.v[i];
if(res.v[i]<0)cy=1,res.v[i]+=base;
else cy = 0;
}
while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
return res;
}
bint operator * (const bint &a,const bint &b){
bint res;res.ln = 0;
if(0==b.ln){res.v[0]=0;return res;}
int i,j,cy;
for(i=0;i<a.ln;i++){
for(j=cy=0;j<b.ln||cy>0;j++,cy/=base){
if(j<b.ln)cy+=a.v[i]*b.v[j];
if(i+j<res.ln)cy+=res.v[i+j];
if(i+j>=res.ln)res.v[res.ln++] = cy%base;
else res.v[i+j] = cy%base;
}
}
return res;
}
bint operator / (const bint &a,const bint &b){
bint tmp,mod,res;
int i,lf,rg,mid;
mod.v[0] = mod.ln = 0;
for(i=a.ln-1;i>=0;i--){
mod = mod*base+a.v[i];
for(lf=0,rg=base-1;lf<rg;){
mid = (lf+rg+1)/2;
if(b*mid<=mod)lf=mid;
else rg = mid-1;
}
res.v[i] = lf;
mod = mod-b*lf;
}
res.ln = a.ln;
while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
return res;
}
bint operator % (const bint &a,const bint &b){
bint tmp,mod,res;
int i,lf,rg,mid;
mod.v[0] = mod.ln = 0;
for(i=a.ln-1;i>=0;i--){
mod = mod*base+a.v[i];
for(lf=0,rg=base-1;lf<rg;){
mid = (lf+rg+1)/2;
if(b*mid<=mod)lf=mid;
else rg = mid-1;
}
res.v[i] = lf;
mod = mod-b*lf;
}
res.ln = a.ln;
while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;
return mod;
}
int digits(bint &a){
if(a.ln==0)return 0;
int l = (a.ln-1)*4;
for(int t=a.v[a.ln-1];t;++l,t/=10);
return l;
}
bool read(bint &b,char buf[]){
if(1!=scanf("%s",buf))return 0;
int w,u,ln = strlen(buf);
memset(&b,0,sizeof(bint));
if('0'==buf[0]&&0==buf[1])return 1;
for(w=1,u=0;ln;){
u += (buf[--ln]-'0')*w;
if(w*10==base){
b.v[b.ln++] = u;
u = 0;
w = 1;
}else{
w *=10;
}
}
if(w!=1)b.v[b.ln++]=u;
return 1;
}
void write(const bint &v){
int i;
printf("%d",v.ln==0?0:v.v[v.ln-1]);
for(i=v.ln-2;i>=0;i--){
printf("%04d",v.v[i]);
}
printf("\n");
}
int main(){
bint a,b,c;char buf[100];
read(a,buf);b=a-1;
write((a%b));
return 0;
}