hdu - 1104 Remainder (bfs + 数论)

http://acm.hdu.edu.cn/showproblem.php?pid=1104

注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数.

而%可以得到正数和负数.

所以需要 a mod b = (a % b + b) % b 这样转换得到。

并且,由于新的N可以很大,所以我们每一步都要取%,而且最后要mod k,正常来说每步都%k就行了,但是由于其中的一个操作是N%m,所以我们每一步就不能%k了(%k%m混用会导致%出来的答案错误),而要%(k *m)(其实%(k,m的公倍数都行))。

还有就是用了vis标记数组,标记过的就不能在标记了。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <vector>
  5 #include <cstring>
  6 #include <string>
  7 #include <algorithm>
  8 #include <string>
  9 #include <set>
 10 #include <functional>
 11 #include <numeric>
 12 #include <sstream>
 13 #include <stack>
 14 #include <map>
 15 #include <queue>
 16 #pragma comment(linker, "/STACK:102400000,102400000")
 17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
 18
 19 #define ll long long
 20 #define inf 0x7f7f7f7f
 21 #define lc l,m,rt<<1
 22 #define rc m + 1,r,rt<<1|1
 23 #define pi acos(-1.0)
 24
 25 #define L(x)    (x) << 1
 26 #define R(x)    (x) << 1 | 1
 27 #define MID(l, r)   (l + r) >> 1
 28 #define Min(x, y)   (x) < (y) ? (x) : (y)
 29 #define Max(x, y)   (x) < (y) ? (y) : (x)
 30 #define E(x)        (1 << (x))
 31 #define iabs(x)     (x) < 0 ? -(x) : (x)
 32 #define OUT(x)  printf("%I64d\n", x)
 33 #define lowbit(x)   (x)&(-x)
 34 #define Read()  freopen("a.txt", "r", stdin)
 35 #define Write() freopen("b.txt", "w", stdout);
 36 #define maxn 1000000000
 37 #define N 2510
 38 #define mod 1000000000
 39 using namespace std;
 40
 41 struct point
 42 {
 43     int num;
 44     string a;
 45 };
 46
 47 int n,m,k,mk;
 48 int vis[1000005];
 49
 50 void bfs()
 51 {
 52     memset(vis,0,sizeof(vis));
 53     point s;
 54     s.num=n,s.a="";
 55     queue<point>que;
 56     que.push(s);
 57     vis[(n%k+k)%k]=1;
 58     while(!que.empty())
 59     {
 60         point e=que.front();que.pop();
 61         if((e.num%k+k)%k==((n+1)%k+k)%k)
 62         {
 63             cout<<e.a.length()<<endl;
 64             cout<<e.a<<endl;
 65             return ;
 66         }
 67         s.num=(e.num+m)%mk;
 68         s.a=e.a+‘+‘;
 69         if(!vis[(s.num%k+k)%k])
 70         {
 71             que.push(s);
 72             vis[(s.num%k+k)%k]=1;
 73         }
 74         s.num=(e.num-m)%mk;
 75         s.a=e.a+‘-‘;
 76         if(!vis[(s.num%k+k)%k])
 77         {
 78             que.push(s);
 79             vis[(s.num%k+k)%k]=1;
 80         }
 81         s.num=(e.num*m)%mk;
 82         s.a=e.a+‘*‘;
 83         if(!vis[(s.num%k+k)%k])
 84         {
 85             que.push(s);
 86             vis[(s.num%k+k)%k]=1;
 87         }
 88         s.num=(e.num%m+m)%m%mk;
 89         s.a=e.a+‘%‘;
 90         if(!vis[(s.num%k+k)%k])
 91         {
 92             que.push(s);
 93             vis[(s.num%k+k)%k]=1;
 94         }
 95     }
 96     puts("0");
 97 }
 98 int main()
 99 {
100    // freopen("a.txt","r",stdin);
101     while(~scanf("%d%d%d",&n,&k,&m))
102     {
103         if(n==0&&m==0&&k==0) break;
104         mk=m*k;
105         bfs();
106     }
107     return 0;
108 }
时间: 2024-10-07 11:33:08

hdu - 1104 Remainder (bfs + 数论)的相关文章

HDU 1104 Remainder(BFS路径记录+数论)

Remainder Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4337    Accepted Submission(s): 1095 Problem Description Coco is a clever boy, who is good at mathematics. However, he is puzzled by a d

【bfs】hdu 1104 Remainder

[bfs]hdu 1104 Remainder 题目链接:hdu 1104 Remainder 很不错的一道搜索题目,但是有几个关键问题要注意. 最短路径,果断bfs+Queue 路径的存储问题,之前只想把每一步的计算结果存储到queue(int)Q中,后来发现路径无法记录,就选择存储节点的方式并用string保存路径,queue(node)Q,开一个临时的节点node p,每进行一次运算就更新它的路径string+'op',最终输出的一定是完整路径!! 但最关键的是取模!!!!! discus

hdu 1104 Remainder

http://acm.hdu.edu.cn/showproblem.php?pid=1104 a%b=(a%b+b)%b; 题意:开始给了你n, k, m,每次由+m, -m, *m, modm得到新的N,继续对N这样的操作,直到(n+1) mod k== N mod k时结束,并且打印路径 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <queue> 5

HDU 1104 Remainder (BFS求最小步数 打印路径)

题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将负数变为正数的,所以取余的时候要注意,又因为各种问题…… % 的问题是:a mod b = (a % b + b) % b,不是平常的取余. 讨论里有个人是这样说的: 关于此题的用bfs搜索,大家都是知道的. 既然使用了bfs,则队列是少不了的,为了叙述的方便,记运算符集合 oper = {+,-,

hdu 1104 数论+bfs

题意:给n,m,k;输出n经过+-*%后(n%k+k)%k==((n+1)%k)%k  输出最小路径与运算副 zsd:% 只是求余数 有正负 mod 是求模 无正负. yhd:对m*k求余对 对k求余不对 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5

HDU 4861 Couple doubi(数论)

HDU 4861 Couple doubi 题目链接 题意:给定k,p,有k个球,每个球的值为1^i+2^i+...+(p-1)^i (mod p) (1 <= i <= k),现在两人轮流取球,最后球的值总和大的人赢,问先手是否能赢 思路:先手不可能输,非赢即平,那么只要考虑每种球的值, 利用费马小定理或欧拉定理,很容易得到该函数的循环节为p - 1, 那么i如果为p - 1的倍数,即为循环节的位置,那么每个值都为1,总和为p - 1 如果i不在循环节的位置,任取一个原根g,根据原根的性质,

[ACM] hdu 1242 Rescue (BFS+优先队列)

Rescue Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison. Angel's friends want to save Angel. Their task is:

HDU 3049 Data Processing 数论题解

Problem Description Chinachen is a football fanatic, and his favorite football club is Juventus fc. In order to buy a ticket of Juv, he finds a part-time job in Professor Qu's lab. And now, Chinachen have received an arduous task--Data Processing. Th

HDU 4937 Lucky Number(数论)

HDU 4937 Lucky Number 题目链接 题意:给定一个数字,求它再x进制下,每位进制位上都只有3,4,5,6,求这样的x有多少种,如果无限种输出-1 思路:首先3 4 5 6特判掉是无限的,很容易想到就不证明了,然后就是枚举数字的最后一位3,4,5,6,然后进制数肯定来自这个数字的因子,因为剩下的数字肯定是a1x^1 + a2x^2 + a3x^3...这样的,这样只要在因子中找进制,去判断即可.找因子的方法用先分解再dfs找,直接试除会超时 代码: #include <cstdi