您的位置:首页 > 其它

百练 2793:孙子问题

2015-08-10 11:19 267 查看
http://bailian.openjudge.cn/practice/2793/

#include<cmath>
#include<iostream>
using namespace std;
long EE(long a,long b,long &x,long &y){ //extend eulid
long d;
if(b==0){
x=1;y=0;
return a;
}
d=EE(b,a%b,x,y);
long t=x;
x=y;
y=t-a/b*y;
return d;
}
int main(){
long lcm,g,gcd,r,rem,x,y,a[10],k[10],p[10],q[11],gc[10],gd[10],res[10];
int n;
while(cin>>n){
if(n==0) break;
int i;
for(i=0;i<n;i++) cin>>a[i];
lcm=a[0];
for(i=0;i<n;i++) lcm=lcm/EE(lcm,a[i],x,y)*a[i];
for(i=0;i<n;i++) p[i]=q[i]=lcm/a[i];
q[n]=lcm;
g=p[n-1];
gc[n-1]=lcm;
for(i=n-1;i>0;i--){
gc[i-1]=EE(g,p[i],x,y);
g=gc[i-1];
}
for(i=0;i<n;i++) gd[i]=gc[i];
rem=1;
for(i=0;i<n;i++){
gcd=EE(p[i],gc[i],x,y);
q[i]/=gcd;
gd[i]/=gcd;
r=rem;
while(r<0) r+=lcm;
r/=gcd;
r%=gd[i];
EE(q[i],gd[i],x,y);
k[i]=r*x;
while(k[i]<=0) k[i]+=a[i];
res[i]=p[i];
res[i]*=k[i];
rem-=res[i];
}
for(i=0;i<n;i++) cout<<res[i]<<" ";
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: