[数学记录]AT2164 [AGC006C] Rabbit Exercise
command_block · · 个人记录
题意 : 数轴上有
兔子会以以下的方式在数轴上行动 :一轮包含
(保证
记选的兔子坐标为
(注意,即使兔子的位置顺序变化了,但是编号仍保持不变)
兔子会进行
实际上相当于交换了
记录这些交换构成的映射,接下来就是计算映射的
注意答案可能爆 int。
#include<algorithm>
#include<cstdio>
#define ll long long
#define MaxN 100500
using namespace std;
int buf[MaxN],sav[MaxN];
void pow(int *a,int n,ll t)
{
for (int i=1;i<=n;i++){buf[i]=a[i];a[i]=i;}
while(t){
if (t&1)for (int i=1;i<=n;i++)a[i]=buf[a[i]];
for (int i=1;i<=n;i++)sav[i]=buf[i];
for (int i=1;i<=n;i++)buf[i]=sav[buf[i]];
t>>=1;
}
}
int n,m,p[MaxN];
ll x[MaxN],ans[MaxN],k;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)scanf("%lld",&x[i]);
for (int i=n;i;i--)x[i]-=x[i-1];
scanf("%d%lld",&m,&k);
for (int i=1;i<=n;i++)p[i]=i;
for (int i=1,j;i<=m;i++){
scanf("%d",&j);
swap(p[j],p[j+1]);
}
pow(p,n,k);
for (int i=1;i<=n;i++){
ans[i]=ans[i-1]+x[p[i]];
printf("%lld\n",ans[i]);
}return 0;
}