本题是bfs,不过有点小阴谋,在num因为大量运算时会很大,于是我们要取余,但不能直接用%k,而是用%km(k*m),因为不止要和k线性同余还要和m线性同余,也就是说,如果只用%k,那么我对n做了一步处理后,产生的结果只对k线性同余,假如下一步用%m,那么就错了比如,8 3,10,op为+%,如果用%k,答案就是2,但正确答案是1。
#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 1005;
const int inf = 1<<30;
int n,k,m,ans;
bool vis[maxn*maxn];
struct node
{
int num;
string str;
};
void BFS()
{
node cur,cnt;
int km = k*m;
ans = ((n+1)%k+k)%k;
memset( vis,0,sizeof(vis) );
queue<node>que;
vis[(n%k+k)%k] = true;
cur.num = n;
que.push(cur);
while( !que.empty() )
{
cur = que.front(); que.pop();
for( int i = 1; i <= 4; i ++ )
{
if( i == 1 )
{
cnt.num = (cur.num + m)%km;
cnt.str = cur.str + '+';
}
else if ( i == 2 )
{
cnt.num = (cur.num - m)%km;
cnt.str = cur.str + '-';
}
else if ( i == 3 )
{
cnt.num = (cur.num * m)%km;
cnt.str = cur.str + '*';
}
else
{
cnt.num = ((cur.num%m+m)%m)%km;
cnt.str = cur.str + '%';
}
if( (cnt.num%k+k)%k == ans )
{
cout<<cnt.str.length()<<endl;
cout<<cnt.str<<endl;
return;
}
if( !vis[(cnt.num%k+k)%k] )
{
vis[(cnt.num%k+k)%k] = true;
que.push(cnt);
}
}
}
cout<<0<<endl;
}
int main()
{
//freopen("data.txt","r",stdin);
while( scanf("%d%d%d",&n,&k,&m) == 3,(n||k||m) )
{
BFS();
}
return 0;
}