题意 :给你3个公式 给出x0,x1,y0,y1 算出矩阵 c在求出种类编号最小的数
种类编号= Di%m; Di为0点到i点最短的距离;
思路:给你3个公式
因为( i*n+j )差不多是n*(n-1)
所以 X Y Z 都先算到n*(n-1)个
然后得到邻接矩阵
dijkstra得到最短路 d [ n ]
全部 %m 输出最小值
#include<stdio.h>
#include <stdlib.h>
#include <limits.h>
#include<string.h>
#define LL __int64
#define M 1000*1000+1111
LL cost[1022][1033];
LL x[M],y[M],d[M],z[M];
LL n,m;
bool used[M];
void dijkstra(LL s,LL V) // 邻接矩阵表示
{
int i;
for(i=0; i<=V; i++)
{
//初始化
d[i]=INT_MAX;
used[i]=false;
}
d[s]=0;
while(true)
{
int u;
int v=-1;
// 在未使用过的顶点中选择一个距离最小的顶点
for( u=0; u<V; u++)
{
if(!used[u]&&(v==-1 || d[u]<d[v]))
v=u;
}
if(v==-1) break; //顶点全部使用过
used[v]=true;
for( u=0; u<V; u++)
{
// 更新从v点能到达的点的最短路
d[u]=min(d[u],d[v]+cost[v][u]);
}
}
}
void init(){
memset(used,false ,sizeof(used));
memset(cost,0 ,sizeof(cost));
}
int main()
{
while(scanf("%I64d",&n)!=EOF){
init();
int i,j;
scanf("%I64d%I64d%I64d%I64d%I64d",&m,&x[0],&x[1],&y[0],&y[1]);
z[0]=((x[0]*90123+y[0])%8475871+1);
for(i=2; i<=n*n+n; i++){//得到X Y Z;
x[i]= (12345 +( x[i-1]* 23456)% 5837501 + (x[i-2]* 34567)% 5837501 +( x[i-1] * x[i-2] * 45678)% 5837501) % 5837501;
y[i]= (56789 + (y[i-1]* 67890)% 9860381+ (y[i-2]* 78901)% 9860381 + (y[i-1] * y[i-2] * 89012)% 9860381) % 9860381;
z[i-1]=((x[i-1]*90123)%8475871+y[i-1])%8475871+1;
}
for(i=0; i<n; i++){
for(j=0; j<n; j++){
if(i==j)
cost[i][j]=0;
else
cost[i][j]=z[i*n+j];//得到矩阵
}
}
dijkstra(0,n);//最短路
LL ans[1033];
for(i=1; i<n; i++)
ans[i]=d[i]%m;
LL minnn=INT_MAX;
for(i=1;i<n;i++)
minnn=min(minnn,ans[i]);
printf("%I64d\n",minnn);
}
return 0;
}