日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)

發(fā)布時間:2025/3/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接: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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。