若a=k*b,若僅通過操作二:將b變換為a需要k步,
由算數基本定理可知:k=p1*p2*……pn(p為素數,且可能重複)
那麼:將b轉化為p1*b需要p1步,將p1*b轉化為p1*p2*b需要p2步,以此類推,將b轉化為a需要(p1+p2+....pn)步
因為(p1*p2*p3...*pn) < (p1+p2+p3+...pn),故而若僅通過操作二將b轉化為a至少需要(p1+p2+p3...+pn)步
因存在刪除操作,我們將問題轉化為圖論:點i和點k*i之間存在單向邊,點i和點i-1之間存在單項邊。起始點為1,終點為n,求1到n的最短路。
我們知道:若僅通過操作二將1轉化為較大的素數a,需要a步。但若通過操作三,我們可以先將1轉化為(a+m),再通過(a+m)-a步操作,得到a。
例如:a=17,18=2*3*3,將1轉化為18需要8步,再將18轉化為17需要1步,共需要9步,遠小於17。
因而我們可推斷:較大的素數,可以通過操作三由較小的素數推出。
實際上,我們需要的素數僅為(2,3,5,7)
接下來,通過最短路演算法,求解
#include #include #include #include #include using namespace std;
const int maxn=1e6+10;
const int inf=0x3f3f3f3f;
int n,dist[maxn];
int p[4]=;
void work()
if(u>1&&dist[u-1]>dist[u]+1)
}}int main()
51NOD 迷宮遊戲 最短路
你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總和盡可能大...
51nod 2673 最短路徑
51nod 最短路徑 1.0 秒 131,072.0 kb 0 分基礎題 給出一張包含n個節點 m條邊的無向圖,請你求出圖上兩點s,t間的最短路徑長度。請大家自行處理重邊和自環 第一行兩個數n,m,分別表示節點數和邊數,以空格隔開,其中1 n 500,1 m 50000 之後m行,每行3個數u,v,...
51Nod 2673 最短路徑
給出一張包含n個節點 m條邊的無向圖,請你求出圖上兩點s,t間的最短路徑長度。請大家自行處理重邊和自環 input 第一行兩個數n,m,分別表示節點數和邊數,以空格隔開,其中1 n 500,1 m 50000 之後m行,每行3個數u,v,wii,表示點u和v間有一條權值為wii的邊,其中1 u,v ...