题目大意是N,K,M可以将N+M-->M,N-M-->M,N*M--->M,N%M--->M,然后求什么时候可以使N%K==(初始N+1)%K,数学不好,只会搜索,BFS 要记录路径
注意N可能是小与0的,要加上n*M直到大于0再求N%KM;
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 1000000+10;
const int INF = 0x3fffffff;
int visited[MAX];
char sign[4] = {'+','-','*','%'};
int Ni,K,M,km;
typedef struct
{
int Nc;
queue<char> sign;
}node;
int BFS()
{
memset(visited,0,sizeof(visited));
queue<node> q;
node a;
Ni = (Ni % km) + km;
a.Nc = Ni;
q.push(a);
visited[a.Nc]=1;
while(!q.empty())
{
node p;
p = q.front();
q.pop();
if(p.Nc % K == (Ni+1)%K)
{
int len = p.sign.size();
cout<<len<<endl;
while(!p.sign.empty())
{
cout<<p.sign.front();
p.sign.pop();
}
cout<<endl;
return 1;
}
for(int i = 0; i < 4; i++)
{
a = p;
if(i == 0)
{
a.Nc = (p.Nc + M)%km;
a.sign.push(sign[i]);
if(!visited[a.Nc])
{
visited[a.Nc] = 1;
q.push(a);
}
}
if(i == 1)
{
a.Nc = ((p.Nc - M)%km + km )%km;
a.sign.push(sign[i]);
if(!visited[a.Nc])
{
visited[a.Nc] = 1;
q.push(a);
}
}
if(i == 2)
{
a.Nc = (p.Nc * M) %km;
a.sign.push(sign[i]);
if(!visited[a.Nc])
{
visited[a.Nc] = 1;
q.push(a);
}
}
if(i == 3)
{
a.Nc = (p.Nc % M)%km;
a.sign.push(sign[i]);
if(!visited[a.Nc])
{
visited[a.Nc] = 1;
q.push(a);
}
}
}
}
return 0;
}
int main()
{
while(cin>>Ni>>K>>M)
{
if((Ni && K && M) == 0)
{
break;
}
km = K * M;
if(BFS() == 0)
{
cout<<'0'<<endl;
}
}
return 0;
}

1692

被折叠的 条评论
为什么被折叠?



