WA90求助(WA#5)(玄关)
查看原帖
WA90求助(WA#5)(玄关)
1054528
Fa_Nanf1204楼主2024/7/26 14:45
#include<bits/stdc++.h>
#define ll long long 
using namespace std; 
ll n,m;
const int maxlen=50000;
struct bignum{//大整数结构体
    string s;
    int len,num[maxlen];//len是长度,num存数字的每一位(第0位是个位,第一位是十位……)
};
bignum reverse(string x){//初始化大整数结构体
    bignum xx;
    xx.len=x.size(),xx.s=x;
    memset(xx.num,0,sizeof(xx.num));
    for(int i=0;i<xx.len;i++) xx.num[i]=xx.s[xx.len-i-1]-'0';//倒序存放
    return xx;
}
bool operator < (string x,string y){//对大整数的比较(下同)
    if(x.size()<y.size()) return true;
    if(x.size()>y.size()) return false;
    if(x.size()==y.size()){
        for(int i=0;i<x.size();i++){//比较大整数的每一位(下同)
            if(x[i]<y[i]) return true;
            if(x[i]>y[i]) return false;
        }
        return false;
    }
}
bool operator > (string x,string y){
    if(x.size()>y.size()) return true;
    if(x.size()<y.size()) return false;
    if(x.size()==y.size()){
        for(int i=0;i<x.size();i++){
            if(x[i]>y[i]) return true;
            if(x[i]<y[i]) return false;
        }
        return false;
    }
}
bool operator == (string x,string y){
    if(x.size()!=y.size()) return false;
    for(int i=0;i<x.size();i++) if(x[i]!=y[i]) return false;
    return true;
}
bool operator <=(string x,string y){
    return !(x>y);
}
bool operator >=(string x,string y){
    return !(x<y);
}
bool operator !=(string x,string y){
    return !(x==y);
}
string operator + (string x,string y){//计算两个大整数相加
    bignum xx=reverse(x),yy=reverse(y),result;
    memset(result.num,0,sizeof(result.num));
    result.len=max(xx.len,yy.len);//计算结果的长度(下同)
    for(int i=0;i<result.len;i++) result.num[i]+=xx.num[i]+yy.num[i],result.num[i+1]+=result.num[i]/10,result.num[i]%=10;//相加每一位并进位
    if(result.num[result.len]!=0) result.len++;//去前缀0(下同)
    for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';//倒序取出结果
    return result.s;
}
string operator - (string x,string y){//计算两个大整数相减
    bignum xx=reverse(x),yy=reverse(y),result;
    memset(result.num,0,sizeof(result.num));
    if(x<y) swap(x,y),swap(xx,yy),result.s+="-";//处理被减数小于减数的情况
    result.len=max(xx.len,yy.len);
    for(int i=0;i<result.len;i++){
        result.num[i]+=xx.num[i]-yy.num[i];
        if(result.num[i]<0) result.num[i]+=10,result.num[i+1]--;//相减并退位
    }
    while(result.num[result.len-1]==0&&result.len>1) result.len--;
    for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
    return result.s;
}
string operator * (string x,string y){//计算两个大整数相乘
    bignum xx=reverse(x),yy=reverse(y),result;
    memset(result.num,0,sizeof(result.num));
    result.len=xx.len+yy.len;
    for(int i=0;i<xx.len;i++) for(int j=0;j<yy.len;j++) result.num[i+j]+=xx.num[i]*yy.num[j];//相乘
    for(int i=0;i<result.len;i++) result.num[i+1]+=result.num[i]/10,result.num[i]%=10;//进位
    while(result.num[result.len-1]==0&&result.len>1) result.len--;
    for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
    return result.s;
}
string operator * (string x,int y){//计算大整数乘整数
    bignum xx=reverse(x),result;
    memset(result.num,0,sizeof(result.num));
    result.len=xx.len+to_string(y).size();
    for(int i=0;i<xx.len;i++) result.num[i]=xx.num[i]*y;//类似乘法竖式的原理
    for(int i=0;i<result.len;i++) result.num[i+1]+=result.num[i]/10,result.num[i]%=10;//进位
    while(result.num[result.len-1]==0&&result.len>1) result.len--;
    for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
    return result.s;
}
string operator * (int y,string x){
    return x*y;
}
string operator / (string x,string y){//计算大整数除以大整数
    bignum result;
    memset(result.num,0,sizeof(result.num));
    int l=0;
    while(y.size()<x.size()) y+="0",l++;//预先初始化y
    for(int i=0;i<=l;i++){
        int k=0;
        while(x>=y) x=x-y,k++;//用减法模拟除法
        y=y.substr(0,y.size()-1);//将y去掉一个末尾0
        result.num[i]=k;//存结果
    }
    for(int i=0;i<=l;i++) if(!(result.s.empty()&&result.num[i]==0)) result.s+=result.num[i]+'0';//防前缀0并存结果
    if(result.s.empty()) result.s="0";
    return result.s;
}
string operator / (string x,int y){//计算大整数除以整数
    int k=0;//k是余数
    bignum xx=reverse(x),result;
    memset(result.num,0,sizeof(result.num));
    result.len=xx.len;
    for(int i=xx.len-1;i>=0;i--) result.num[i]=(k*10+xx.num[i])/y,k=(k*10+xx.num[i])%y;//并且计算每一位的结果
    while(result.num[result.len-1]==0&&result.len>1) result.len--;
    for(int i=0;i<result.len;i++) result.s+=result.num[result.len-i-1]+'0';
    return result.s;
}
string operator % (string x,string y){//计算大整数取模于大整数(与除法仅有返回的变量不同)
    bignum result;
    memset(result.num,0,sizeof(result.num));
    int l=0;
    while(y.size()<x.size()) y+="0",l++;
    for(int i=0;i<=l;i++){
        while(x>y||x==y) x=x-y;
        y=y.substr(0,y.size()-1);
    }
    return x;
}
int operator % (string x,int y){//计算大整数取模于整数(与除法仅有返回的变量不同)
    int k=0;
    bignum xx=reverse(x),result;
    memset(result.num,0,sizeof(result.num));
    result.len=xx.len;
    for(int i=xx.len-1;i>=0;i--) result.num[i]=(k*10+xx.num[i])/y,k=(k*10+xx.num[i])%y;
    return k;
}
string fast_pow(string x,int y){//快速幂
    string sum="1";
    while(y){
        if(y%2) sum=sum*x;
        sum=sum*sum;
        y/=2;
    }
    return sum;
}
string A(int x,int y){//排列
    string sum="1";
    for(int i=x;i>x-y;i--) sum=sum*i;
    return sum;
}
string fact(int x){//阶乘
    return A(x,x);//x!=A(x,x)
}
string C(int x,int y){//组合
    y=min(x-y,y);//C(x,y)=c(x,x-y)
    return A(x,y)/fact(y);
}
int main(){
	cin>>n>>m;
	cout<<(A(n+2,n+2)*A(m,m)*C(n+3,m))-(A(2,2)*C(n+2,m)*A(m,m)*A(n+1,n+1));
	return 0;
}
2024/7/26 14:45
加载中...