您的位置:首页 > 其它

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

2013-03-27 21:02 176 查看
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 150000
bool flag[M];
int prime
, p
, 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数