其实这题主要难在数论。难啊难。多看看别人的思路点击打开链接点击打开链接
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 1000 + 5;
struct node
{
int num, step;
string road;
}beg;
int vis[maxn];
int n, k, m, ans;
const char op[] = {'+', '-', '*', '%'};
int cal(int factor, int oper)
{
switch(oper)
{
case 0:
return (factor + m ) % (m * k);
case 1:
return (factor - m) % (m * k);
case 2:
return (factor * m) % (m * k);
case 3:
return (factor % m + m) % m %(m * k);
}
}
void print(node q)
{
printf("%d\n", q.step);
cout<<q.road<<endl;
}
void bfs()
{
if((n % k + k )% k == ans) {printf("0\n"); return ;}
memset(vis, 0, sizeof(vis));
queue<node> q;
beg.road = "";
q.push(beg);
vis[(n % k + k) % k] = 1;
while(!q.empty())
{
node sq = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
node tq =sq;
//printf("%d\n", tq.num);
tq.num = cal(tq.num, i);
tq.road = tq.road + op[i];
tq.step = tq.step + 1;
if(!vis[(tq.num % k + k) % k])
{
//printf("%d\n", tq.num);
vis[(tq.num % k + k) % k] = 1;
if((tq.num % k + k ) %k == ans) {print(tq); return;}
q.push(tq);
}
}
}
printf("0\n");
}
int main()
{
while(scanf("%d%d%d", &n, &k, &m) == 3 && (n || k || m))
{
ans = ((n + 1) % k + k ) % k;
//printf("%d\n", ans);
beg = (node){n, 0};
//printf("%d %d\n", beg.num, beg.step);
bfs();
}
return 0;
}