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; }
  • 相关阅读:
    React Native 架构演进
    React Native 架构一览
    React Native 在 Airbnb 的起起落落
    React Native简史
    图解云服务模型的演进
    伯克利研究员们眼中的Cloud Computing
    彻底理解 IaaS、PaaS、SaaS
    JS更随机的随机数
    JS自动化
    fingerprint2 计算浏览器指纹分析
  • 原文地址:https://www.cnblogs.com/372465774y/p/3208557.html
Copyright © 2011-2022 走看看