SGU 140 解题手记
SGU 140 解题手记
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> using namespace std; int extended_euclid(int a,int b,int &x,int &y) { if (b) { int r=extended_euclid(b,a%b,x,y); int t=y; y=x-(a/b)*y; x=t; return r; } else { x=1; y=0; return a; } } inline void fit(int &x,int p) { x%=p; if (x<0) x+=p; } int main() { int a[100],x[100]={0},n,p,b,k,t; cin>>n>>p>>b; for (int i(0);i<n;i++) { cin>>a[i]; a[i]%=p; } int valid=0,first,second; for (first=0;first<n;first++) if (a[first]) break; for (second=first+1;second<n;second++) if (a[second]) break; for (int i=0;i<n;i++) valid+=(a[i]>0); if (valid<=1) { if (valid==0 && b>0) cout<<"NO"; else { for (x[first]=0;x[first]<p;x[first]++) if (a[first]*x[first]%p==b) break; cout<<"YES"<<endl; for (int i=0;i<n;i++) cout<<x[i]<<' '; } cout<<endl; } else { k=extended_euclid(a[first],a[second],x[first],x[second]); fit(x[first],p); fit(x[second],p); for (int i=second+1;i<n;i++) if (a[i]) { k=extended_euclid(k,a[i],t,x[i]); fit(x[i],p); for (int j=0;j<i;j++) { x[j]*=t; fit(x[j],p); } } if (b%k) cout<<"NO"<<endl; else { b=b/k%p; cout<<"YES"<<endl; for (int i=0;i<n;i++) cout<<x[i]*b<<' '; cout<<endl; } } return 0; } |
