zoukankan      html  css  js  c++  java
  • 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; }
  • 相关阅读:
    flare3d_plane
    flare3d_TextureFilter
    flare3d_animation
    flare3d黄色星球案例再次解读整理
    pureMVC(二)
    flare3d_ColladaLoader
    flare3d_clone
    四则运算
    15章
    带界面的四则运算
  • 原文地址:https://www.cnblogs.com/372465774y/p/3208557.html
Copyright © 2011-2022 走看看