社区讨论
求优化90分TLE#10
P1932A+B A-B A*B A/B A%B Problem参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lzi53heq
- 此快照首次捕获于
- 2024/08/06 16:09 2 年前
- 此快照最后确认于
- 2024/08/06 16:50 2 年前
CPP
#include<cstdio>
#include<cstring>
const long long N = 1200;
const long long M = 10100;
const long long mod = 1e9;
struct BigInt{
long long a[N];
long long len;
void input(char c[M]){
long long b[M];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
long long lenc=strlen(c);
for(long long i=0,j=lenc;i<lenc;i++,j--){
b[j]=c[i]-'0';
}
len=1;
for(long long i=1;i<=lenc;i+=9,len++){
if(i+8<=lenc){
for(long long k=8;k>=0;k--){
a[len]=a[len]*10+b[i+k];
}
}
else{
for(long long k=lenc-i;k>=0;k--){
a[len]=a[len]*10+b[i+k];
}
}
}
len--;
}
void innum(long long x){
long long b[105];
long long blen=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
if(x==0){
len=1;
return ;
}
while(x){
b[++blen]=x%10;
x/=10;
}
len=1;
for(long long i=1;i<=blen;i+=9,len++){
if(i+8<=blen){
for(long long k=8;k>=0;k--){
a[len]=a[len]*10+b[i+k];
}
}
else{
for(long long k=blen-i;k>=0;k--){
a[len]=a[len]*10+b[i+k];
}
}
}
len--;
}
void print(){
printf("%lld",a[len]);
for(long long i=len-1;i>=1;i--){
printf("%09lld",a[i]);
}
}
BigInt operator + (const BigInt b)const{
BigInt c;
c.len=0;
memset(c.a,0,sizeof(c.a));
long long maxlen=len>b.len?len:b.len;
for(long long i=1;i<=maxlen;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+1]+=c.a[i]/mod;
c.a[i]%=mod;
}
c.len=maxlen;
if(c.a[maxlen+1]!=0){
c.len++;
}
return c;
}
BigInt operator - (const BigInt b)const{
BigInt c;
c.len=0;
memset(c.a,0,sizeof(c.a));
for(long long i=1;i<=len;i++){
c.a[i]=a[i];
}
for(long long i=1;i<=len;i++){
if(c.a[i]<b.a[i]){
c.a[i]=c.a[i]+mod;
c.a[i+1]--;
}
c.a[i]=c.a[i]-b.a[i];
}
c.len=len;
while(c.a[c.len]==0 && c.len>1){
c.len--;
}
return c;
}
BigInt operator * (const BigInt b)const{
BigInt c;
c.len=0;
memset(c.a,0,sizeof(c.a));
for(long long i=1;i<=len;i++){
long long x=0;
for(long long j=1;j<=b.len;j++){
c.a[i+j-1]=a[i]*b.a[j]+x+c.a[i+j-1];
x=c.a[i+j-1]/mod;
c.a[i+j-1]%=mod;
}
c.a[i+b.len]=x;
}
c.len=len+b.len;
while(c.a[c.len]==0 && c.len>1){
c.len--;
}
return c;
}
BigInt operator / (const int b)const{
BigInt aa;
aa.len=0;
memset(aa.a,0,sizeof(aa.a));
for(long long i=1;i<=len;i++){
aa.a[i]=a[len-i+1];
}
BigInt c;
c.len=0;
memset(c.a,0,sizeof(c.a));
long long x=0;
for(long long i=1;i<=len;i++){
c.a[i]=(x*mod+aa.a[i])/b;
x=(x*mod+aa.a[i])%b;
}
c.len=1;
while(c.a[c.len]==0 && c.len<len){
c.len++;
}
for(long long i=1,j=c.len;j<=len;i++,j++){
c.a[i]=c.a[j];
}
c.len=len-c.len+1;
for(long long i=1;i<=c.len/2;i++){
long long t;
t=c.a[i];
c.a[i]=c.a[c.len-i+1];
c.a[c.len-i+1]=t;
}
return c;
}
long long operator % (const int b)const{
BigInt aa;
aa.len=0;
memset(aa.a,0,sizeof(aa.a));
for(long long i=1;i<=len;i++){
aa.a[i]=a[len-i+1];
}
long long x=0;
for(long long i=1;i<=len;i++){
x=(x*mod+aa.a[i])%b;
}
return x;
}
long long operator < (const BigInt b)const{
if(len!=b.len)return len<b.len;
for(long long i=len;i>=1;i--){
if(a[i]!=b.a[i]){
return a[i]<b.a[i];
}
}
return 0;
}
long long operator > (const BigInt b)const{
if(len!=b.len)return len>b.len;
for(long long i=len;i>=1;i--){
if(a[i]!=b.a[i]){
return a[i]>b.a[i];
}
}
return 0;
}
};
BigInt Divide(BigInt a,BigInt b){
BigInt aa,x,jinlv,temp,temp2;
memset(aa.a,0,sizeof(aa.a));
aa.len=a.len;
for(int i=1;i<=a.len;i++){
aa.a[i]=a.a[a.len-i+1];
}
BigInt c,l,r,mid,answer,k,one;
c.len=0;
memset(c.a,0,sizeof(c.a));
x.innum(0);jinlv.innum(mod);one.innum(1);
for(long long i=1;i<=a.len;i++){
temp.innum(aa.a[i]);
temp2=x*jinlv+temp;
l.innum(0);
r.innum(mod);
answer.innum(0);
while(l<r){
mid=l+r+one;
mid=mid/2;
k=mid*b;
if(k>temp2){
r=mid-one;
}
else{
l=mid;
answer=mid;
}
}
c.a[i]=answer.a[1];
temp.innum(answer.a[1]);
x=temp2-temp*b;
}
c.len=1;
while(c.a[c.len]==0 && c.len<a.len){
c.len++;
}
for(long long i=1,j=c.len;j<=a.len;i++,j++){
c.a[i]=c.a[j];
}
c.len=a.len-c.len+1;
for(long long i=1;i<=c.len/2;i++){
long long t;
t=c.a[i];
c.a[i]=c.a[c.len-i+1];
c.a[c.len-i+1]=t;
}
return c;
}
char s1[M],s2[M];
BigInt a,b,c,d;
int main(){
scanf("%s%s",s1,s2);
a.input(s1);b.input(s2);
c=a+b;
c.print();printf("\n");
if(a>b){
c=a-b;
c.print();printf("\n");
}
else{
c=b-a;
printf("-");c.print();printf("\n");
}
c=a*b;
c.print();printf("\n");
c=Divide(a,b);
c.print();printf("\n");
d=a-b*c;
d.print();printf("\n");
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...