因为才刚开始ACM 所以数论知识还不知道 只知道简单的搜索。。。。。
以后学了数论再来看看。
AC代码如下:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
typedef struct{
int now;
int step;
string rode;
}node;
bool visit[1000000];
int N, K, M, result, KM;
void BFS(){
queue<node> q;
node begins;
result = ( ( N + 1 ) % K + K ) % K;
KM = K * M;
memset( visit, 0, sizeof( visit ) );
begins.now = N;
begins.step = 0;
begins.rode = "";
q.push( begins );
visit[( begins.now % K + K ) % K] = 1;
while( !q.empty() ){
node p, temp;
p = q.front();
q.pop();
if( ( p.now % K + K ) % K == result ){
cout << p.step << endl;
cout << p.rode << endl;
return;
}
temp.step = p.step + 1;
temp.now = ( p.now + M ) % KM;
temp.rode = p.rode + "+";
if( !visit[( temp.now % K + K ) % K ] ){
q.push( temp );
visit[ ( temp.now % K + K ) % K ] = 1;
}
temp.now = ( p.now - M ) % KM;
temp.rode = p.rode + "-";
if( !visit[( temp.now % K + K ) % K ] ){
q.push( temp );
visit[ ( temp.now % K + K ) % K ] = 1;
}
temp.now = ( p.now * M ) % KM;
temp.rode = p.rode + "*";
if( !visit[( temp.now % K + K ) % K ] ){
q.push( temp );
visit[ ( temp.now % K + K ) % K ] = 1;
}
temp.now = ( ( p.now % M + M ) %M ) % KM;
temp.rode = p.rode + "%";
if( !visit[( temp.now % K + K ) % K ] ){
q.push( temp );
visit[ ( temp.now % K + K ) % K ] = 1;
}
}
cout << 0 << endl;
}
int main(){
while( scanf( "%d%d%d", &N, &K, &M ) && !( N == 0 && K == 0 && M == 0 ) ){
BFS();
}
return 0;
}