Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃\○/
- ┛┗┛┗┛┃ / /
- ┓┏┓┏┓┃ノ
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃┓
- ┛┗┛┗┛┃┃
- MIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSIC
- */
- #define pragma
- #ifdef pragma
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("no-stack-protector")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC diagnostic ignored "-Wunused-result"
- #endif // pragma
- #include<bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #define ll long long
- #define all(x) begin(x), end(x)
- #define pb push_back
- #define x first
- #define y second
- //#define int long long
- #define zero(two) memset(two, 0, sizeof(two))
- using namespace std;
- using namespace __gnu_pbds;
- typedef vector<int> vi;
- typedef vector<bool> vb;
- typedef pair<int, int> pii;
- typedef long double ld;
- typedef vector<vi> matrix;
- template<typename T>
- using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- const ld PI = atan2(0, -1);
- void seriy() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- // cout << fixed << setprecision(9);
- #if _offline
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
- template <class T = int> inline T readInt();
- inline double readDouble();
- inline int readUInt();
- inline int readChar(); // first non-blank character
- inline void readWord( char *s );
- inline bool readLine( char *s ); // do not save '\n'
- inline bool isEof();
- inline int getChar();
- inline int peekChar();
- inline bool seekEof();
- inline void skipBlanks();
- template <class T> inline void writeInt( T x, char end = 0, int len = -1 );
- inline void writeChar( int x );
- inline void writeWord( const char *s );
- inline void writeDouble( double x, int len = 0 );
- inline void flush();
- static struct buffer_flusher_t {
- ~buffer_flusher_t() {
- flush();
- }
- } buffer_flusher;
- /** Read */
- static const int buf_size = 4096;
- static unsigned char buf[buf_size];
- static int buf_len = 0, buf_pos = 0;
- inline bool isEof() {
- if (buf_pos == buf_len) {
- buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);
- if (buf_pos == buf_len)
- return 1;
- }
- return 0;
- }
- inline int getChar() {
- return isEof() ? -1 : buf[buf_pos++];
- }
- inline int peekChar() {
- return isEof() ? -1 : buf[buf_pos];
- }
- inline bool seekEof() {
- int c;
- while ((c = peekChar()) != -1 && c <= 32)
- buf_pos++;
- return c == -1;
- }
- inline void skipBlanks() {
- while (!isEof() && buf[buf_pos] <= 32U)
- buf_pos++;
- }
- inline int readChar() {
- int c = getChar();
- while (c != -1 && c <= 32)
- c = getChar();
- return c;
- }
- inline int readUInt() {
- int c = readChar(), x = 0;
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- return x;
- }
- template <class T>
- inline T readInt() {
- int s = 1, c = readChar();
- T x = 0;
- if (c == '-')
- s = -1, c = getChar();
- else if (c == '+')
- c = getChar();
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- return s == 1 ? x : -x;
- }
- inline double readDouble() {
- int s = 1, c = readChar();
- double x = 0;
- if (c == '-')
- s = -1, c = getChar();
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- if (c == '.') {
- c = getChar();
- double coef = 1;
- while ('0' <= c && c <= '9')
- x += (c - '0') * (coef *= 1e-1), c = getChar();
- }
- return s == 1 ? x : -x;
- }
- inline void readWord( char *s ) {
- int c = readChar();
- while (c > 32)
- *s++ = c, c = getChar();
- *s = 0;
- }
- inline bool readLine( char *s ) {
- int c = getChar();
- while (c != '\n' && c != -1)
- *s++ = c, c = getChar();
- *s = 0;
- return c != -1;
- }
- /** Write */
- static int write_buf_pos = 0;
- static char write_buf[buf_size];
- inline void writeChar( int x ) {
- if (write_buf_pos == buf_size)
- fwrite(write_buf, 1, buf_size, stdout), write_buf_pos = 0;
- write_buf[write_buf_pos++] = x;
- }
- inline void flush() {
- if (write_buf_pos)
- fwrite(write_buf, 1, write_buf_pos, stdout), write_buf_pos = 0;
- }
- template <class T>
- inline void writeInt( T x, char end, int output_len ) {
- if (x < 0)
- writeChar('-'), x = -x;
- char s[24];
- int n = 0;
- while (x || !n)
- s[n++] = '0' + x % 10, x /= 10;
- while (n < output_len)
- s[n++] = '0';
- while (n--)
- writeChar(s[n]);
- if (end)
- writeChar(end);
- }
- inline void writeWord( const char *s ) {
- while (*s)
- writeChar(*s++);
- }
- inline void writeDouble( double x, int output_len ) {
- if (x < 0)
- writeChar('-'), x = -x;
- int t = (int)x;
- writeInt(t), x -= t;
- writeChar('.');
- for (int i = output_len - 1; i > 0; i--) {
- x *= 10;
- t = std::min(9, (int)x);
- writeChar('0' + t), x -= t;
- }
- x *= 10;
- t = std::min(9, (int)(x + 0.5));
- writeChar('0' + t);
- }
- const int MAXN = 1e3 + 10;
- const int INF = 1e9 + 7;
- const int MAXLOG = 31;
- const int MOD = 1e9 + 7;
- const ld EPS = 1e-4;
- int cnt2[MAXN][MAXN], cnt5[MAXN][MAXN];
- pii pr2[MAXN][MAXN], pr5[MAXN][MAXN];
- int dp2[MAXN][MAXN], dp5[MAXN][MAXN];
- int c2 = 0, c5 = 0;
- string res1;
- string res2;
- signed main() {
- seriy();
- int n;
- n = readInt();
- int a;
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n; j++) {
- a = readInt();
- while((a & 1) == 0) {
- a >>= 1;
- cnt2[i][j]++;
- }
- while(a % 5 == 0) {
- a /= 5;
- cnt5[i][j]++;
- }
- }
- }
- pr2[0][0] = {-1, -1};
- pr5[0][0] = {-1, -1};
- dp2[0][0] = 0;
- dp5[0][0] = 0;
- // zero(dp5);
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n; j++) {
- if(i != 0 || j != 0) {
- dp2[i][j] = INF;
- dp5[i][j] = INF;
- }
- if(i > 0) {
- dp2[i][j] = dp2[i - 1][j];
- dp5[i][j] = dp5[i - 1][j];
- pr2[i][j] = {i - 1, j};
- pr5[i][j] = {i - 1, j};
- }
- if(j > 0) {
- if(dp2[i][j] > dp2[i][j - 1]) {
- dp2[i][j] = dp2[i][j - 1];
- pr2[i][j] = {i, j - 1};
- }
- if(dp5[i][j] > dp5[i][j - 1]) {
- dp5[i][j] = dp5[i][j - 1];
- pr5[i][j] = {i, j - 1};
- }
- }
- dp2[i][j] += cnt2[i][j];
- dp5[i][j] += cnt5[i][j];
- }
- }
- pii st = {n - 1, n - 1};
- // cerr << pr2[0][2].x << " " << pr2[0][2].y << '\n';
- while(st != pii{-1, -1}) {
- // cerr << st.x << " " << st.y << '\n';
- c2 += cnt2[st.x][st.y];
- c5 += cnt5[st.x][st.y];
- if(st.x - pr2[st.x][st.y].x == 1) res1 += 'D';
- else res1 += 'R';
- st = pr2[st.x][st.y];
- }
- int ans1 = min(c2, c5);
- st = {n - 1, n - 1};
- c2 = 0, c5 = 0;
- res1.pop_back();
- while(st != pii{-1, -1}) {
- c2 += cnt2[st.x][st.y];
- c5 += cnt5[st.x][st.y];
- if(st.x - pr5[st.x][st.y].x == 1) res2 += 'D';
- else res2 += 'R';
- st = pr5[st.x][st.y];
- if(min(c2, c5) >= ans1) {
- writeInt(ans1);
- writeChar('\n');
- for(int i = res1.size() - 1; i >= 0; i--) {
- writeChar(res1[i]);
- }
- return 0;
- }
- }
- res2.pop_back();
- writeInt(min(min(c2, c5), ans1));
- writeChar('\n');
- if(min(c2, c5) < ans1) {
- for(int i = res2.size() - 1; i >= 0; i--) {
- writeChar(res2[i]);
- }
- }
- else {
- for(int i = res1.size() - 1; i >= 0; i--) {
- writeChar(res1[i]);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement