哈希+map,不会哈希的我好弱鸡。。。
#include<bits/stdc++.h>
using namespace std;
const int seed=133331;
int n,m,p;
int a[550][550],b[550][550],minid[550];
map<int,int> mp;
int getminid(int *c)
{
int i=0,j=1,k=0,tmp;
while(i<m&&j<m&&k<m)
{
tmp=c[(i+k)%m]-c[(j+k)%m];
if(!tmp)
k++;
else
{
if(tmp>0)
i+=k+1;
else
j+=k+1;
if(i==j)
j++;
k=0;
}
}
if(i<j)
return i;
else
return j;
}
int main()
{
int i,j,ans,tmp;
while(cin>>n>>m>>p)
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++)
{
sort(a[i],a[i]+m);
for(j=0;j<m;j++)
{
b[i][j]=(a[i][(j+1)%m]-a[i][j]+p)%p;
}
}
for(i=0;i<n;i++)
{
minid[i]=getminid(b[i]);
}
mp.clear();
ans=0;
for(i=0;i<n;i++)
{
tmp=1;
for(j=0;j<m;j++)
{
tmp=tmp*seed+b[i][(minid[i]+j)%m];
}
ans+=mp[tmp];
mp[tmp]++;
}
printf("%d\n",ans);
}
}