hdu 1104 Remainder

// 题意就是 n经过和m 的+ - * % 后的结果%k后 与最初的(n+1)%k 是否会相等 要是存在
// 那么 求最少的步数
// 明显的模拟加bfs 不过我却忽略了2个重点:
// 1. 这里 % 是 mod 就是结果必须非负
// 2. a%k%m!=a%m%k
// 第一点比较好解决
// 第二点就是 a%km%m==a%m%km a%km%k=a%k%km 所以这个也就解决了 注:km=k*m

#include <iostream> #include <math.h> #include <map> #include <stack> #include <queue> #include <vector> #include <algorithm> #include <stdio.h> #include <string.h> using namespace std; #define maxm 10010 #define maxn 1000010 bool vi[maxn]; int from[maxn],ch[maxn]; int dis[maxn]; void out(int u){ if(u!=from[u]) { out(from[u]); printf("%c",ch[u]); } } int main() { int n,m,k; int km; int i; int u,v,t; int ans,flag; while(scanf("%d %d %d",&n,&k,&m),n|k|m){ memset(vi,0,sizeof(vi)); km=k*m; for(i=0;i<=km;i++) from[i]=i; ans=((n+1)%k+k)%k; queue<int> Q; n=(n%km+km)%km; Q.push(n); vi[n]=1; dis[n]=0; flag=0; while(!Q.empty()){ t=u=Q.front(); Q.pop(); if(u%k==ans){flag=1;break;} v=((u+m)%km+km)%km; if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='+';Q.push(v);} v=((u-m)%km+km)%km; if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='-';Q.push(v);} v=((u*m)%km+km)%km; if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='*';Q.push(v);} v=((u%m)%km+km)%km; if(!vi[v]){vi[v]=1;from[v]=t;dis[v]=dis[t]+1;ch[v]='%';Q.push(v);} } if(!flag) printf("0 "); else{ printf("%d ",dis[t]); out(t); printf(" "); } } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/3208557.html