題目大意:給定乙個數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 型別打表表示下標...