显示代码纯文本
#include<cstdio>
using namespace std;
const int maxn=11502;
unsigned get(unsigned);
unsigned char f[maxn][maxn];
unsigned n,p,t;
int main(){
freopen("NC.in","r",stdin);
freopen("NC.out","w",stdout);
register unsigned ans=0u;
scanf("%u%u",&n,&p);
for(register unsigned i=1u;i<=n;i++){
scanf("%u",&t);
f[0][i]=t%p;
}
for(register unsigned i=1u;i<=n;i++)for(register unsigned j=1u;j<=n;j++)f[i][j]=get(f[i-1u][j])%p;
for(register unsigned i=1u;i<=n;i++){
for(register unsigned j=1u;j<=n;j++){
f[i][j]+=f[get(f[i-1][j])][get(f[i-1][j]+1)];
if(f[i][j]>=p)f[i][j]%=p;
ans+=f[i][j];
}
ans%=p;
}
printf("%u",ans);
return 0;
}
inline unsigned get(register unsigned x){
if(x>=p)x%=p;
x^=(x>>7u)^(x<<3u)^(x>>2u);
if(x>=n)x%=n;
return ++x;
}