POJ 1465 bfs,同餘剪枝

2021-07-28 07:59:18 字數 497 閱讀 7083

題目大意:給定乙個數n,和m個數,問求n的最小倍數使得這個數的每一位都是那m個數中的;

題目解析:開始想的肯定是將這m個數慢慢dfs過去,注意如果bfs過程中如果遇到當前餘數已經被發現就應該剪枝(同餘定理),因為之前那個數肯定小,並且如果可以生成可行解也一定在之前那個數的基礎上;

ac**:

#include#include#include#include#includeusing namespace std;

const int maxn = 5050;

int n,m,num[maxn];

bool vis[maxn];

struct node

node()

}q[maxn];

int bfs()

{ int front=0,tail=1;

q[front].pre=-1;

q[front].r=0;

q[front].dig=0;

while(front

POJ1426(BFS 同餘定理)

find the multiple 注意點 可以用一棵樹來表示bfs中各個枝,左枝0,右枝1,然後n 2是n的父節點。類似於huffman樹的定理,最後的輸出序列由 2,2交替運算得來。所以本題關鍵點就是用huffman樹結構儲存所有餘數,並最終輸出。include include include ...

POJ 2635(同餘定理)

首先介紹一下同餘定理 所謂的同餘,顧名思義,就是許多的數被乙個數d去除,有相同的餘數。d數學上的稱謂為模。如a 6,b 1,d 5,則我們說a和b是模d同餘的。因為他們都有相同的餘數1。數學上的記法為 a b mod d 可以看出當n常用公式 1 a a mod d 2 a b mod d b a ...

POJ 2769 簡單的同餘問題

題意簡述 sin 號在 0 10 6 範圍內,在每個組裡找到乙個最小的正整數m,是的當前組內的所有數對模m均不同餘。思路 基本思路是使m 從小到大遞增注意驗證是否滿足集合u中任意兩個數m取模不相同,如果滿足則停止迴圈,輸出此時m的值,否者繼續遞增檢驗。這裡巧妙的地方在於使用bool 型別打表表示下標...