

时限 1s,但是评测机好慢我最后 20% 的测试点每次都稍微超时几百毫秒,求调。(此题有人通过)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int g[5010][5010];
int n,m;
ll a,b,c,d,p;
int dist[10010];
int main(){
scanf("%d%d%lld%lld%lld%lld%lld",&n,&m,&a,&b,&c,&d,&p);
for(int i=1,prev=a;i<=n*m;i++)
prev=g[(i-1)/m+1][(i-1)%m+1]=(b*prev%p*prev%p+c*prev%p+d)%p;
ll ans=0;
memset(dist,0x7f,sizeof(dist));
dist[1]=0;
for(int cur=1,oldcur;cur;){
ans+=dist[cur];
dist[cur]=-1; oldcur=cur; cur=0;
if(oldcur<=n){
for(int j=n+1;j<=n+m;j++){
if(dist[j]>g[oldcur][j-n]) dist[j]=g[oldcur][j-n];
if(dist[cur]>dist[j]&&dist[j]!=-1) cur=j;
}
for(int j=1;j<=n;j++)
if(dist[cur]>dist[j]&&dist[j]!=-1) cur=j;
}else{
for(int j=1;j<=n;j++){
if(dist[j]>g[j][oldcur-n]) dist[j]=g[j][oldcur-n];
if(dist[cur]>dist[j]&&dist[j]!=-1) cur=j;
}
for(int j=n+1;j<=n+m;j++)
if(dist[cur]>dist[j]&&dist[j]!=-1) cur=j;
}
}
printf("%lld",ans);
}