hdu Remainder
Remainder |
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 240 Accepted Submission(s): 65 |
Problem Description
Coco is a clever boy, who is good at mathematics. However, he is puzzled by a difficult mathematics problem. The problem is: Given three integers N, K and M, N may adds (‘+’) M, subtract (‘-‘) M, multiples (‘*’) M or modulus (‘%’) M (The definition of ‘%’ is given below), and the result will be restored in N. Continue the process above, can you make a situation that “[(the initial value of N) + 1] % K” is equal to “(the current value of N) % K”? If you can, find the minimum steps and what you should do in each step. Please help poor Coco to solve this problem.
You should know that if a = b * q + r (q > 0 and 0 <= r < q), then we have a % q = r. |
Input
There are multiple cases. Each case contains three integers N, K and M (-1000 <= N <= 1000, 1 < K <= 1000, 0 < M <= 1000) in a single line. The input is terminated with three 0s. This test case is not to be processed.
|
Output
For each case, if there is no solution, just print 0. Otherwise, on the first line of the output print the minimum number of steps to make “[(the initial value of N) + 1] % K” is equal to “(the final value of N) % K”. The second line print the operations to do in each step, which consist of ‘+’, ‘-‘, ‘*’ and ‘%’. If there are more than one solution, print the minimum one. (Here we define ‘+’ < ‘-‘ < ‘*’ < ‘%’. And if A = a1a2...ak and B = b1b2...bk are both solutions, we say A < B, if and only if there exists a P such that for i = 1, ..., P-1, ai = bi, and for i = P, ai < bi)
|
Sample Input
2 2 2 -1 12 10 0 0 0 |
Sample Output
0 2 *+ |
Author
Wang Yijie
|
Recommend
Eddy
|
分析:bfs类题,关键在于对k*m取模来作为标记下标,为避免模为负数,应使用x%y=(x%y+y)%y这个技巧。
#include<cstdio> #include<iostream> #include<queue> #include<cstring> using namespace std; #define MAXN 1000010 int c[MAXN]; int fa[MAXN]; int vis[MAXN]; int s[MAXN]; char op[5] = "+-*%"; int mod(int a, int b) { return ( a % b + b) % b; } int main() { int des, n, k, m, next, now, mo, cnt; while (scanf("%d%d%d", &n, &k, &m) != EOF && k) { mo = m*k; queue <int> q; des = mod(n + 1, k); n = mod(n, mo); memset(vis, 0, sizeof (vis)); q.push(n); vis[n] = 1; fa[n] = -1; c[n] = -1; while (!q.empty()) { now = q.front(); q.pop(); for (int i = 0; i < 4; ++i) { if (i == 0)next = (now + m) % mo; else if (i == 1)next = mod(now - m, mo); else if (i == 2)next = now * m % mo; else next = now % m; if (!vis[next]) { vis[next] = 1; fa[next] = now; c[next] = i; if (next % k == des) goto L; q.push(next); } } } printf("0\n"); continue; L: cnt = 0; while (fa[next] >= 0) { s[cnt++] = c[next]; next = fa[next]; } printf("%d\n", cnt); while (cnt) printf("%c", op[s[--cnt]]); printf("\n"); } return 0; }
这条路我们走的太匆忙~拥抱着并不真实的欲望~