小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。
小蓝的图由2021 个结点组成,依次编号1 至2021。
对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点之间没有边相连;
如果a 和b 的差的绝对值小于等于21,则两个点之间有一条长度为a 和b 的最小公倍数的无向边相连。
例如:结点1 和结点23 之间没有边相连;结点3 和结点24 之间有一条无向边,长度为24;
结点15 和结点25 之间有一条无向边,长度为75。
请计算,结点1 和结点2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
ll dp[3000];
int main()
{ memset(dp,0x3f3f3f3f,sizeof(dp));dp[1]=0;
ll co=2021,t,tt; // cin>>co;
for(int i=1;i<=co;i++)
{ if(i-21<1)t=1;
else t=i-21;
for(int j=t;j<=i-1;j++)
{
dp[i]=min(dp[i],dp[j]+(i*j)/(std::__gcd(i,j)));
}
}
cout<<dp[co];
}