大数模板-加乘除-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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |