#include<cstdio>
#include<cstring>
#define maxn 50010
/*
矩阵太神奇了,或者说二进制数太神奇了!无限感慨啊
此题移动一次的矩阵可以求出来,然后移动n次就是矩阵的n次方啊
但如果构建矩阵的话太耗费空间,肯定不行。那我们就模拟一下矩阵乘法
移动1次,是什么情况
移动2次是不是就是移动1次的基础上再移动1次
移动4次是不是就是移动2次的基础上再移动2次
移动8次呢。。。。。。。
*/
int f[32][50010];//f[i][j]表示移动1>>i次对应的坐标
int n,m,p,a,b;
void offset()
{
memset(f[0],0,sizeof(f[0]));
for(int i=1;i<=n/m;i++)
f[0][i*m]=i;
int tmp=n/m+1;
for(int i=1;i<=n;i++)
if(!f[0][i])f[0][i]=tmp++;
for(int i=1;i<32;i++)
for(int j=1;j<=n;j++)
{
f[i][j]=f[i-1][f[i-1][j]];
}
}
int pre[50010];
int res[50010];
int main()
{
while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)
{
offset();
for(int i=1;i<=n;i++)
res[i]=pre[i]=i;
for(int i=0;i<32&&p;i++)
{
if(p%2)
{
for(int j=1;j<=n;j++)
res[j]=pre[f[i][j]];
for(int j=1;j<=n;j++)
pre[j]=res[j];
}
p=p>>1;
//模拟的矩阵乘法,或者说数的分解
}
printf("%d",res[a]);
for(int i=a+1;i<=b;i++)
printf(" %d",res[i]);
printf("\n");
}
return 0;
}
zoj 3292 Shuffle 矩阵思想 太神奇了 谢谢oldy的启发
最新推荐文章于 2020-09-10 10:58:46 发布