大數模板-加乘除-String類實現

來源:互聯網
上載者:User
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,int b){    string result;    int carry=0,i,Size=a.size(),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,i,j,k,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 150000bool flag[M];int prime[N], p[N], len;  // prime 記錄素數, p 記錄素數的冪  len 記錄長度void calprime(){    memset(flag,false,sizeof(flag));    int i,j,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,k,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,j,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,0,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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.