比赛 |
位运算及及其应用题单 |
评测结果 |
AAAAA |
题目名称 |
64位整数乘法 |
最终得分 |
100 |
用户昵称 |
AeeE5x |
运行时间 |
0.039 s |
代码语言 |
C++ |
内存使用 |
4.19 MiB |
提交时间 |
2025-01-25 11:41:55 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
struct bign{
int d[20001],len;
void clean(){while(len>1&&!d[len-1])len--;}
bign(){memset(d,0,sizeof d),len=1;}
bign(int num){*this=num;}
bign(char* num){*this=num;}
bign operator =(const char* num){
memset(d,0,sizeof d);
len=strlen(num);
for(int i=0;i<len;i++) d[i]=num[len-i-1]-'0';
clean();
return *this;
}
bign operator =(int num){
char s[20];
sprintf(s,"%d",num);
*this=s;
return *this;
}
bign operator +(const bign &b)const{
bign c=*this;
int i;
for(i=0;i<b.len;i++){
c.d[i]+=b.d[i];
if(c.d[i]>9) c.d[i]%=10,c.d[i+1]++;
}
while(c.d[i]>9) c.d[i++]%=10,c.d[i]++;
c.len=max(len,b.len);
if(c.d[i]&&c.len<=i) c.len=i+1;
return c;
}
bign operator -(const bign &b)const{
bign c=*this;
int i;
for (i=0;i<b.len;i++){
c.d[i]-=b.d[i];
if(c.d[i]<0) c.d[i]+=10,c.d[i+1]--;
}
while(c.d[i]<0) c.d[i++]+=10,c.d[i]--;
c.clean();
return c;
}
bign operator *(const bign &b)const{
int i,j;
bign c;
c.len=len+b.len;
for(j=0;j<b.len;j++) for(i=0;i<len;i++) c.d[i+j]+=d[i]*b.d[j];
for(i=0;i<c.len-1;i++) c.d[i+1]+=c.d[i]/10,c.d[i]%=10;
c.clean();
return c;
}
bign operator /(const bign &b){
int i,j;
bign c=*this,a=0;
for(i=len-1;i>=0;i--){
a=a*10+d[i];
for(j=0;j<10;j++) if(a<b*(j+1)) break;
c.d[i]=j;
a=a-b*j;
}
c.clean();
return c;
}
bign operator %(const bign &b)const{
int i,j;
bign a=0;
for(i=len-1;i>=0;i--){
a=a*10+d[i];
for(j=0;j<10;j++) if(a<b*(j+1)) break;
a=a-b*j;
}
return a;
}
bign operator +=(const bign &b){
*this=*this+b;
return *this;
}
bign operator -=(const bign &b){
*this=*this-b;
return *this;
}
bool operator <(const bign &b)const{
if(len!=b.len) return len<b.len;
for(int i=len-1;i>=0;i--) if(d[i]!=b.d[i]) return d[i]<b.d[i];
return false;
}
bool operator >(const bign &b)const{return b<*this;}
bool operator <=(const bign &b)const{return !(b<*this);}
bool operator >=(const bign &b)const{return !(*this<b);}
bool operator !=(const bign &b)const{return b<*this||*this<b;}
bool operator ==(const bign &b)const{return !(b<*this)&&!(b>*this);}
string str()const{
char s[20001]={};
for(int i=0;i<len;i++) s[len-1-i]=d[i]+'0';
return s;
}
};
istream& operator >>(istream &in,bign &x){
string s;
in>>s;
x=s.c_str();
return in;
}
ostream& operator <<(ostream &out,const bign &x){
out<<x.str();
return out;
}
int main(){
freopen("64mul.in","r",stdin);
freopen("64mul.out","w",stdout);
bign a,b,p;cin>>a>>b>>p;
cout<<(a*b%p);
return 0;
}