hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1104
?題意:(注意題目中的%是指mod)開始給了你n, k, m。。。。每次由+m, -m, *m, modm得到新的N,繼續(xù)對N這樣的操作,
直到(n+1) mod k== N mod k時結(jié)束。。。并且打印路徑
? ? %與mod的區(qū)別:%出來的數(shù)有正有負(fù),符號取決于左操作數(shù)。。。而mod只能是正(因為a = b * q + r (q > 0 and 0 <= r < q),
then we have a mod q = r ? ?中r要大于等于0小于q)。。。。。
所以要用%來計算mod的話就要用這樣的公式:a mod b = (a % b + b) % b括號里的目的是把左操作數(shù)轉(zhuǎn)成正數(shù)
由于新的N可以很大,所以我們每一步都要取%,而且最后要mod k,正常來說每步都%k就行了,
但是由于其中的一個操作是N%m,所以我們每一步就不能%k了(%k%m混用會導(dǎo)致%出來的答案錯誤),
而要%(k *m)(其實%(k,m的公倍數(shù)都行))
然后,vis[這里放的要是遍歷的點mod k (想清楚標(biāo)記的目的是避免結(jié)果重復(fù))]而那四個操作避免過大則取余就可以了,而不需要取mod
記錄路徑,直接用string來累加路徑就行了。。。
#include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; struct node {int n,step;string str; }; int n,k,m; int vis[1000002]; void bfs() {node p,q;queue<node> Q;p.n=n;p.step=0;p.str="";int s=((n+1)%k+k)%k;int km=k*m;memset(vis,0,sizeof(vis));vis[(n%k+k)%k]=1;Q.push(p);while(!Q.empty()){q=Q.front();Q.pop();if(s==(q.n%k+k)%k){printf("%d\n",q.step);cout<<q.str<<endl;return;}p.step=q.step+1;for(int i=0;i<4;i++){if(i==0){p.n=(q.n+m)%km;p.str=q.str+'+';}else if(i==1){p.n=(q.n-m)%km;p.str=q.str+'-';}else if(i==2){p.n=(q.n*m)%km;p.str=q.str+'*';}else{p.n=(q.n%m+m)%m%km;p.str=q.str+'%';}if(!vis[(p.n%k+k)%k]){vis[(p.n%k+k)%k]=1;Q.push(p);}}}printf("0\n");return ; } int main() {while(~scanf("%d%d%d",&n,&k,&m),n,k,m){bfs();}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KMP--字符串匹配
- 下一篇: 阿里技术|Java 的这些坑,你踩到了吗