大数模板-加乘除-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; }
相关文章推荐
- 通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。
- 大数加减法的string类实现
- [原创]汇编实现大数乘除运算的雏形
- [原创]汇编实现大数乘除运算的雏形
- 个人实现的大数模板(加、乘)
- 通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。
- c++大数、分数、模数运算实现模板
- 自己实现string类的相关函数
- POI实现一个通用的Excel读取模板
- [转帖] 使用模板实现ASP代码与页面分离
- 行为模式之模板方法模式(Template Pattern)C++实现
- 数据模板的JScript.net实现
- 模板的声明和实现为何要放在头文件中?
- 转帖:关于string类的两种实现
- Aspx页面作为最好的模板引擎一种实现
- KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)
- 从Spring HibernateTemplate模板方法设计模式的实现谈起
- 模板匹配(opencv2.4.11实现)
- java实现大数相加
- C++实现一个堆(模板)