加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数模板-加乘除-String类实现

发布时间:2020-12-14 04:13:25 所属栏目:大数据 来源:网络整理
导读:string add(string s1,string s2) { int j,l,la,lb; string max,min; max=s1;min=s2; if(s1.length()s2.length()) {max=s2;min=s1;} la=max.size();lb=min.size(); l=la-1; for(j=lb-1;j=0;j--,l--) max[l] += min[j]-'0'; for(j=la-1;j=1;j--) if(max[j]'9'
string add(string s1,string s2) 
{ 
     
    int j,l,la,lb; 
    string max,min; 
    max=s1;min=s2; 
    if(s1.length()<s2.length()) {max=s2;min=s1;} 
    la=max.size();lb=min.size(); 
    l=la-1; 
    for(j=lb-1;j>=0;j--,l--) max[l] += min[j]-'0';                          
    for(j=la-1;j>=1;j--) if(max[j]>'9'){max[j]-=10;max[j-1]++;} 
    if(max[0]>'9') {max[0]-=10;max='1'+max;} 
    return max; 
} 
string Multiply(const string& a,int b)
{
    string result;
    int carry=0,i,Size=a.size(),c;
    for(i=Size-1;i>=0;--i)
    {
        c = (a[i]-'0')*b + carry;
        carry = c/10;
        c %= 10;
        result.push_back(c+'0');
    }
    while(carry)
    {
        c = carry%10;
        carry /= 10;
        result.push_back(c+'0');
    }
    convert(result);
    return result;
}
string Divide(const string& a,c;
    for(i=0;i<Size;++i)
    {
        c = (a[i]-'0')+carry*10;
        carry = c%b;
        c /= b;
        if(c==0&&result.size()==0)continue;
        else result.push_back(c+'0');
    }
    return result;
}



 int MOD(string a,int mod)
 {
 int len=a.length(),i;
 int t=0;//中间变量,最终存储余数
  for(i=0;i<len;i++)
 {
   t*=10;
    t+=a[i]-'0';
     if(t>=mod)
       t=t%mod;
 }
  return t;
}

string add(string a,string b)//大数加法
 {
     int i,j,k,flag;
     string c;
     c="";
     i=a.size()-1;j=b.size()-1;
     k=0;flag=0;//flag为标记是否要进位
     while(i>=0&&j>=0)
     {
         c+=(a[i]+b[j]-'0'+flag);
         //往string类型的字符串加数字子不能像数组那样直接c[k++],会内存错误
         flag=0;
         if(c[k]>'9')
         {
             flag=1;
             c[k]=c[k]-10;
         }
         i--;j--;k++;
     }
     while(i>=0)
     {
         c+=(a[i]+flag);
         flag=0;
         if(c[k]>'9')
         {
             flag=1;
             c[k]=c[k]-10;
         }
         i--;k++;
     }
     while(j>=0)
     {
         c+=b[j]+flag;
         flag=0;
         if(c[k]>'9')
         {
             flag=1;
             c[k]=c[k]-10;
         }
         j--;k++;
     }
     char t;
     if(flag)
     {
         c+=(flag+'0');k++;
     }
     for(i=0,j=k-1;i<j;i++,j--)
     {
             t=c[i];c[i]=c[j];c[j]=t;
     }
     return c;
 }
 
 string mult(string a,string b)//大数乘法
 {
     int flag=0,p,q,t,max;
     char ch;
     string c,ans;
     p=a.size()-1;q=b.size()-1;
     ans="0";
     for(i=p;i>=0;i--)//可以分解为p个一位数和一个大数的乘法
     {
         flag=0;c="";
         for(j=i;j<p;j++) c+='0';
         for(j=q;j>=0;j--)
         {
             t=(b[j]-'0')*(a[i]-'0')+flag;
             flag=t/10;
             c+=(t%10+'0');
         }
         if(flag) c+=(flag+'0');
         for(j=0,k=c.size()-1;j<k;j++,k--)
         {
             ch=c[j];c[j]=c[k];c[k]=ch;
         }
         ans=add(ans,c);
     }
     return ans;
 }


 
#include<iostream>
#include<algorithm>
using namespace std;
#define M 2000005
#define MOD 20100501
#define N 150000
bool flag[M];
int prime[N],p[N],len;  
// prime 记录素数, p 记录素数的幂  len 记录长度
void calprime()
{
    memset(flag,false,sizeof(flag));
    int i,k=2;
    prime[1]=2;
    for(i=3;i<=M;i+=2)
    {
        if(!flag[i])
        {
            prime[k++]=i;
            for(j=i;j<=M;j+=i)
                flag[j]=true;
        }
    }
}
void divide(int n)
{
    int i=1,j=1;
    while(n>1)
    {
        while(n%prime[i]==0)
        {
            p[i]++;
            n/=prime[i];
        }
        i++;
    }
}
void divf(int n,int oper)//divide factorial,(n!分解结果中2的指数=n/2+n/4+n/8+...)
{
    int i=1,j=1,temp=n;
    while(prime[i]<=n)
    {
        temp=n;
        while(temp!=0)
        {
            if(oper==0)
                p[i]+=temp/prime[i];
            else
                p[i]-=temp/prime[i];
            temp/=prime[i];
        }
        i++;
    }
    len=max(len,i);
}
__int64 giveres()//cal (prime[i]^p[i])%M连乘
{
    __int64 ans=1;
    int i,k;
    for(i=1;i<=len;i++)
    {
        __int64 a=prime[i],b=p[i],res=1;//cal a^b%MOD
        while(b)
        {
            if(b&1)//b%2==1
                res*=a%MOD;
            a=a*a%MOD;
            b=b>>1;
        }
        ans=ans*res%MOD;
    }
    return ans;
}
int main()
{
    calprime();
    int n,m,cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&n,&m);
        if(n<m)
        {
            printf("0/n");
            continue;
        }
        memset(p,sizeof(p));
        //divide (n-m+1)
        int temp=n-m+1;
        divide(temp);
        divf(n+m,0);
        divf(m,1);
        divf(n+1,1);
        __int64 ans=giveres();
        printf("%I64d/n",ans);
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读