题目链接:点击打开链接
题意:有n个城市,然后两两城市间的花费都可以用一个比较奇葩的方式算出,然后以1号城市为起点到每个城市的最短路对m取模最小值即为答案。
思路:看懂了题意还需要思路吗?一切都是那么红果果。。。
/**********************************************************************
Problem : 4849 ( Wow! Such City! ) Judge Status : Accepted
RunId : 11467398 Language : G++ Author : alpc_wcq
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
**********************************************************************/
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
#define maxe 1000010
#define mod1 5837501
#define mod2 9860381
#define inf 1e9
long long x[1234600],y[1234600],z[1234600],map[1001][1001],dis[1234600];
int n,m;
bool flag[1234600];
void init()
{
int upp=n*(n+1);
for(int i=1;i<2;i++)
z[i]=((x[i]*90123)%8475871+y[i])%8475871;
z[1]++;
for(int i=2;i<=upp;i++)
{
x[i]=(12345+(x[i-1]*23456)%mod1+(x[i-2]*34567)%mod1+((x[i-1]*x[i-2])%mod1)*45678)%mod1;
y[i]=(56789+(y[i-1]*67890)%mod2+(y[i-2]*78901)%mod2+((y[i-1]*y[i-2])%mod2)*89012)%mod2;
z[i]=((x[i]*90123)%8475871+y[i])%8475871;
++z[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
map[i][j]=z[n*i+j];
// printf("%8d ",map[i][j]);
}
//puts("");
map[i][i]=0;
}
}
void dijkstra()
{
memset(flag,0,sizeof(flag));
int i,j,md,temp;
for(i=0;i<n;i++)
{
dis[i]=inf;
}
dis[0]=0;
for(int i=0;i<n;i++)
{
md=inf;
for(j=0;j<n;j++)
{
if(!flag[j]&&dis[j]<md)
{
md=dis[j];
temp=j;
}
}
//printf("temp %d\n",temp);
flag[temp]=true;
for(j=0;j<=n;j++)
{
if(!flag[j]&&md+map[temp][j]<dis[j])
dis[j]=md+map[temp][j];
}
}
}
int main ()
{
//freopen("data.in","r",stdin);
while (scanf("%d%d%lld%lld%lld%lld",&n,&m,&x[0],&x[1],&y[0],&y[1])!=EOF)
{
init();
int ans=inf;
dijkstra();
for(int i=1;i<n;i++)
{
//printf("%lld\n",dis[i]);
int temp=dis[i]%m;
//printf("%d\n",dis[i]);
ans=min(ans,temp);
}
printf("%d\n",ans);
}
return 0;
}