代码片
```javascript
```
代码片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
struct BigInt
{
static const int M=1000;
int num[M +10],len;
BigInt()
{
clean();
}
void clean()
{
memset(num,0,sizeof(num));
len=1;
}
void read()
{
char str[M+10];
scanf("%s",str);
len=strlen(str);
FOR(i,1,len)
num[i]=str[len-i]-'0';
}
void write()
{
_FOR(i,len,1)
printf("%d",num[i]);
//puts("");
}
void itoBig(int x)
{
clean();
while(x != 0)
{
num[len++]=x%10;
x/=10;
}
if(len!=1)
len--;
}
bool operator < (const BigInt &cmp) const
{
if(len!=cmp.len)
return len<cmp.len;
_FOR(i,len,1)
if(num[i]!=cmp.num[i])
return num[i]<cmp.num[i];
return false;
}
bool operator > (const BigInt &cmp) const
{
return cmp <*this;
}
bool operator <= (const BigInt &cmp) const
{
return !(cmp<*this);
}
bool operator != (const BigInt &cmp) const
{
return cmp<*this||*this<cmp;
}
bool operator == (const BigInt &cmp) const
{
return !(cmp<*this||*this<cmp);
}
BigInt operator + (const BigInt &A) const
{
BigInt S;
S.len=max(len,A.len);
FOR(i,1,S.len)
{
S.num[i]+=num[i]+A.num[i];
if(S.num[i]>=10)
{
S.num[i]-=10;
S.num[i+1]++;
}
}
while(S.num[S.len+1])
S.len++;
return S;
}
BigInt operator - (const BigInt &A) const
{
BigInt S;
S.len=max(len,A.len);
FOR(i,1,S.len)
{
S.num[i]+=num[i]-A.num[i];
if(S.num[i]<0)
{
S.num[i]+=10;
S.num[i+1]--;
}
}
while(!S.num[S.len]&&S.len>1)
S.len--;
return S;
}
BigInt operator * (const BigInt &A) const
{
BigInt S;
if((A.len==1&&A.num[1]==0)||(len==1&&num[1]==0))
return S;
S.len=A.len+len-1;
FOR(i,1,len)
FOR(j,1,A.len)
{
S.num[i+j-1]+=num[i]*A.num[j];
S.num[i+j]+=S.num[i+j-1]/10;
S.num[i+j-1]%=10;
}
while(S.num[S.len+1])
S.len++;
return S;
}
BigInt operator / (const BigInt &A) const
{
BigInt S;
if((A.len==1&&A.num[1]==0)||(len==1&&num[1]==0))
return S;
BigInt R,N;
S.len=0;
_FOR(i,len,1)
{
N.itoBig(10);
R=R*N;
N.itoBig(num[i]);
R=R+N;
int flag=-1;
FOR(j,1,10)
{
N.itoBig(j);
if(N*A>R)
{
flag=j-1;
break;
}
}
S.num[++S.len]=flag;
N.itoBig(flag);
R=R-N*A;
}
FOR(i,1,S.len/2)
swap(S.num[i],S.num[len-i+1]);
while(!S.num[S.len]&&S.len>1)
S.len--;
return S;
}
BigInt operator % (const BigInt &A) const
{
BigInt S;
BigInt P=*this/A;
S=*this - P * A;
return S;
}
};
int main()
{
BigInt a,b;
a.read();b.read();
(a+b).write();
/* --------------------------------------------------------
特别注意(减法符号运算判断符号)多亏大佬的悉心指点
if(a<b)
{
printf("-")
(b-a).write();
} else (a-b).write();
--------------------------------------------------------
*/
return 0;
}
麦森数
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
int n,f[1001],res[1001],sav[1001];
void w1()
{
memset(sav,0,sizeof sav);
for(int i=1;i<=500;i++)
for(int j=1;j<=500;j++)
{
sav[i+j-1]+=res[i]*f[j];
}
for(int i=1;i<=500;i++)
{
sav[1+i]+=sav[i]/10;
sav[i]%=10;
}memcpy(res,sav,sizeof res);
}
void w2()
{
memset(sav,0,sizeof sav);
for(int i=1;i<=500;i++)
for(int j=1;j<=500;j++)
{
sav[i+j-1]+=f[i]*f[j];
}
for(int i=1;i<=500;i++)
{
sav[1+i]+=sav[i]/10;
sav[i]%=10;
}memcpy(f,sav,sizeof f);
}
int p;
int main()
{
scanf("%d",&p);
printf("%d\n",(int)(log10(2)*p+1));
f[1]=2,res[1]=1;
while(p!=0)
{
if(p%2==1)w1();
p/=2;
w2();
}res[1]--;
for(int i=500;i>=1;i--)
{
if(i!=500&&i%50==0)printf("\n%d",res[i]);
else printf("%d",res[i]);
}
}
#include<cstdio>
#include<algorithm>
#define maxn 1000
#define len 10000
using namespace std;
struct tnode{int a,b,c;}q[maxn+20];
int ans[maxn+20],p[maxn+20],g[maxn+20];
bool cmp(tnode x,tnode y)
{
return x.c<y.c;
}
void div(int x)
{
int i,j,k,last=0;
if(p[p[0]]>=x)g[0]=p[0];
else g[0]=p[0]-1;
for(i=p[0];i>=1;i--)
{
g[i]=p[i]+last*len;
last=g[i]%x,g[i]/=x;
}
}
void MAX()
{
int i,j,k;
if(ans[0]>g[0])return;
if(ans[0]==g[0])
{
for(i=ans[0];i>=1;i--)
{
if(ans[i]>g[i])return;
if(ans[i]<g[i])break;
}
if(i==0)return;
}
for(i=0;i<=g[0];i++)ans[i]=g[i];
}
void multi(int x)
{
int i,j,k,last=0;
for(i=1;i<=p[0];i++)
{
p[i]=p[i]*x+last;
last=p[i]/len,p[i]%=len;
}
if(last>0)p[++p[0]]=last;
}
int main()
{
int i,j,k,n;
scanf("%d%d%d",&n,&p[1],&k);
p[0]=1;
for(i=1;i<=n;i++)
{
scanf("%d%d",&q[i].a,&q[i].b);
q[i].c=q[i].a*q[i].b;
}
sort(q+1,q+n+1,cmp);
for(i=1;i<=n;i++)
{
div(q[i].b);
MAX();
multi(q[i].a);
}
printf("%d",ans[ans[0]]);
for(i=ans[0]-1;i>=1;i--)printf("%04d",ans[i]);
return 0;
}