正解:分治or線段樹
對於列分治,每次分治時,先把≤mid的區間處理,再統計≤mid的答案,然後加入>mid的區間中,複雜度O(n*m log n)。
取模的話,%一波r_64大神。。
//It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define inf (1<<30)
#define il inline
#define RG register
#define ll long long
#define rhl 1000000007
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
int a[760][760],vis[562510],n,m,k,T;
ll f[760][760],s[562510];
il int gi(){
RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x;
}
il void solve(RG int l,RG int r){
if (l==r) return; RG int mid=(l+r)>>1;
solve(l,mid); T++; RG ll sum=0;
for (RG int i=2;i<=n;++i){
for (RG int j=l;j<=mid;++j){
if (vis[a[i-1][j]]!=T) s[a[i-1][j]]=0,vis[a[i-1][j]]=T;
(sum+=f[i-1][j])%=rhl,(s[a[i-1][j]]+=f[i-1][j])%=rhl;
}
for (RG int j=mid+1;j<=r;++j){
if (vis[a[i][j]]!=T) s[a[i][j]]=0,vis[a[i][j]]=T;
(f[i][j]+=sum-s[a[i][j]]+rhl)%=rhl;
}
}
solve(mid+1,r); return;
}
il void work(){
n=gi(),m=gi(),k=gi(); f[1][1]=1;
for (RG int i=1;i<=n;++i)
for (RG int j=1;j<=m;++j) a[i][j]=gi();
solve(1,m); printf("%lld\n",f[n][m]); return;
}
int main(){
File("cowhouse");
work();
return 0;
}