#include #include #include #include #include #include #include #include #include using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair #define vi vector #define ll long long #define SZ(x) ((int)(x.size())) #define IN(x,y) ((y).find((x)) != (y).end()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof (t.begin()) i = t.begin(); i != t.end(); i++) #define fi first #define se second #define mod 23 int v[10], r[10]; void mm() { printf("NUM %d\n", mod); printf("MOD\n"); } void poly(vector a, int n) { FOR(i,n-1) printf("DUP\n"); printf("NUM %d\n", a[0]); printf("MUL\n"); mm(); for(int i = 1; i <= n; i++) { printf("NUM %d\n", a[i]); printf("ADD\n"); mm(); if(i==n) break; printf("MUL\n"); mm(); } printf("END\n\n"); } int qpow(int a, int n) { if(n==0) return 1; int b = qpow(a,n/2); b=b*b%mod; if(n&1) b=b*a%mod; return b; } int RevMod(int a) { return qpow(a, mod-2); } int Gauss(vector &A, vi &b, vi &x, int P) { int m = SZ(A), n = SZ(A[0]), k, r; vi q; for(k = 0; k < min(m,n); k++) { int i,j; for(j = k; j < n; j++) for(i = k; i < m; i++) if(A[i][j] != 0) goto found; break; found: if(j != k) FOR(t,m) swap(A[t][j], A[t][k]); q.pb(j); if(i != k) { swap(A[i], A[k]); swap(b[i], b[k]); } REP(j, k+1, m-1) if(A[j][k] != 0) { int l = (A[j][k] * RevMod(A[k][k])) % P; REP(i, k+1, n-1) A[j][i] = (P + A[j][i] - (l * A[k][i]) % P) % P; b[j] = (P + b[j] - (l * b[k]) % P) % P; } } r = k; x.clear(); x.resize(n,0); REP(k,r,m-1) if(b[k] != 0) return -1; for(int k = r-1; k >= 0; k--) { int s = b[k]; REP(j,k+1,r-1) s = (P + s - (A[k][j] * x[j]) % P ) % P; x[k] = (s * RevMod(A[k][k])) % P; } for(int k = r-1; k >= 0; k--) swap(x[k], x[q[k]]); return n-r; } int main () { while(1) { int n; scanf("%d", &n); if(!n) return 0; FOR(i,n) scanf("%d%d", &v[i], &r[i]); vector > A(n, vector(n)); vector b(n); vector x(n); FOR(i,n) FOR(j,n) { A[i][j] = qpow(v[i], j); printf("%d ", A[i][j]); if(j==n-1) printf("\n"); } FOR(i,n) b[i] = r[i]; Gauss(A,b,x,mod); reverse(x.begin(), x.end()); FOREACH(i,x) printf("%d ", *i); printf("\n"); poly(x, n-1); } return 0; }