POJ 1282 庆典的日期
我都不知道我是怎么搞过去的???
正解是置换快速幂
可惜我不理解。。
#include <cstdio>
using namespace std;
int n,p;
int f[210][210],s[210][210];
int main()
{
register int i,j;
scanf("%d %d",&n,&p);
for (i=1;i<=n;i++)
for (j=1;j<=p;j++)
scanf("%d",&f[j][i]);
for (i=1;i<=n;i++) f[i][0]=1;
int k=p,bs=1;
while (bs!=n)
{
i=1;int now=1;
for (j=1;j<=n-bs+1;j++) s[1][j]=j;
for (j=1;j<=200;j++) s[j][0]=0;
bool ff;
do
{
ff=false;
if (i>k) i-=k;
s[now][0]+=f[i][0];
for (j=1;j<=n-bs+1;j++) s[now+1][f[i][j]]=s[now][j];
for (j=1;j<=n-bs+1;j++) s[now][j]=s[now+1][j];
i++;
if (s[now][1]==1)
{
ff=true;
now++;
for (j=1;j<=n-bs+1;j++) s[now][j]=j;
}
}
while (!(i==k+1&&ff));
bs++;k=now-1;
for (i=1;i<=k;i++) f[i][0]=s[i][0];
for (i=1;i<=k;i++)
for (j=1;j<=n-bs+1;j++) f[i][s[i][j+1]-1]=j;
if (f[1][0]>1000000000) break;
}
if (f[1][0]<1000000000) printf("%d\n",f[1][0]);
else printf("No one knows.");
return 0;
}