栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3341 Voyager 1

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3341 Voyager 1

#include<cstdio>#include<cmath>#include<vector>#include<cstring>using namespace std;#define N 1100#define base 10000struct bint{int ln,v[N];bint(int r=0){for(ln=0;r>0;r/=base)v[ln++]=r%base;}bint& operator = (const bint &r){memcpy(this,&r,(r.ln+1)*sizeof(int));return *this;}};bool operator < (const bint &a,const bint &b){int i;if(a.ln!=b.ln)return a.ln<b.ln;for(i=a.ln-1;i>=0&&a.v[i]==b.v[i];i--);return i<0?0:a.v[i]<b.v[i];}bool operator <= (const bint &a,const bint &b){return !(b<a);}bint operator + (const bint &a,const bint &b){bint res; int i,cy=0;for(i=0;i<a.ln||i<b.ln||cy>0;i++){if(i<a.ln)cy+=a.v[i];if(i<b.ln)cy+=b.v[i];res.v[i]=cy%base; cy/=base;}res.ln=i;return res;}bint operator - (const bint &a,const bint &b){bint res;int i,cy=0;for(res.ln=a.ln,i=0;i<res.ln;i++){res.v[i]=a.v[i]-cy;if(i<b.ln)res.v[i]-=b.v[i];if(res.v[i]<0)cy=1,res.v[i]+=base;else cy=0;}while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;return res;}bint operator * (const bint &a,const bint &b){bint res;res.ln=0;if(b.ln==0){ res.v[0]=0; return res; }int i,j,cy;for(i=0;i<a.ln;i++){for(j=cy=0;j<b.ln||cy>0;j++,cy/=base){if(j<b.ln)cy+=a.v[i]*b.v[j];if(i+j<res.ln)cy+=res.v[i+j];if(i+j>=res.ln)res.v[res.ln++]=cy%base;else res.v[i+j]=cy%base;}}return res;}bint operator / (const bint &a,const bint &b){bint tmp,mod,res;int i,lf,rg,mid;mod.v[0]=mod.ln=0;for(i=a.ln-1;i>=0;i--){mod=mod*base+a.v[i];for(lf=0,rg=base-1;lf<rg;){mid=(lf+rg+1)/2;if(b*mid<=mod)lf=mid;else rg=mid-1;}res.v[i]=lf;mod=mod-b*lf;}res.ln=a.ln;while(res.ln>0&&res.v[res.ln-1]==0)res.ln--;return res;}void write(const bint &v){printf("%d",v.ln==0?0:v.v[v.ln-1]);for(int i=v.ln-2;i>=0;i--)printf("%04d",v.v[i]);printf("n");}bint mul[170];int vis[1100],back[170];vector<int>prm;void init(){ memset(vis,0,sizeof(vis)); mul[0]=1; for(int i=2;i<1000;++i)if(!vis[i]) for(int j=i*i;j<1000;j+=i) vis[j]=1; prm.push_back(1); for(int i=2;i<1000;++i)if(!vis[i]) prm.push_back(i); for(int i=1;i<169;++i) { int ttmp=1; for(int j=1;j<169;++j)if(i!=j) ttmp=ttmp*prm[j]%prm[i]; for(int j=1;j<prm[i];++j) if(ttmp*j%prm[i]==1) { back[i]=j; break; } mul[i]=mul[i-1]*prm[i]; }}int mod[3][170],len,slen;bint tmp,num[2];char s[2][1100],str[310000];int main(){ init(); while(scanf("%s",s[0])!=EOF) { slen=strlen(s[0]); num[0].ln=0; for(int i=slen-1;i>=0;i-=4) { int tmp=0; for(int j=i,k=0,bas=1;j>=0&&k<4;--j,++k,bas*=10) tmp+=((int)(s[0][j]-'0'))*bas; num[0].v[num[0].ln++]=tmp; } scanf("%s",s[1]); slen=strlen(s[1]); num[1].ln=0; for(int i=slen-1;i>=0;i-=4) { int ttmp=0; for(int j=i,k=0,bas=1;j>=0&&k<4;--j,++k,bas*=10) ttmp+=((int)(s[1][j]-'0'))*bas; num[1].v[num[1].ln++]=ttmp; } for(int i=1;i<=168;++i) { tmp=num[0]/prm[i]; tmp=num[0]-tmp*prm[i]; if(tmp.ln==0) mod[1][i]=0; else mod[1][i]=tmp.v[0]; tmp=num[1]/prm[i]; tmp=num[1]-tmp*prm[i]; if(tmp.ln==0) mod[2][i]=0; else mod[2][i]=tmp.v[0]; } scanf("%d",&len); scanf("%s",str); for(int i=0,k1=0,k2=1,k3=2;i<len;++i,k1=(k1+1)%3,k2=(k2+1)%3,k3=(k3+1)%3) { if(str[i]=='*') { for(int j=1;j<169;++j) mod[k1][j]=mod[k2][j]*mod[k3][j]%prm[j]; } else if(str[i]=='+') { for(int j=1;j<169;++j) mod[k1][j]=(mod[k2][j]+mod[k3][j])%prm[j]; } else { for(int j=1;j<169;++j) mod[k1][j]=(mod[k2][j]-mod[k3][j]+prm[j])%prm[j]; } } bint ans=0; for(int i=1;i<169;++i) ans=mul[168]/prm[i]*back[i]*mod[(len-1)%3][i]+ans; while(mul[168]<=ans) ans=ans-mul[168]; write(ans); } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376869.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号