题目背景
没有背景
我写不出来了qwq
题目描述
Chino给定了n个数a1...an,给定常数s,m,她会轮流对这n个数做k组操作,每组操作包含以下几步:
1.swap(as,am)(交换as,am)
2.2.将n个数都向前平移一位(第1个移动到第n个位置上)
Chino想知道,k组操作后,这n个数分别是多少?
Orz yky,dyh,wjk,jjy,cxr,gsy,cpy,zcy,tyz,yy,hz,zhr,ygg
输入格式
第一行,四个数,n,s,m,k
接下来一行n个数,分别代表a1,a2...an
输出格式
输出一行,n个数,分别代表a1,a2...an
输入输出样例
输入 #1复制
4 1 2 3
1 2 3 4
输出 #1复制
1 2 3 4
说明/提示
对于40%的数据1≤k≤10^7
对于100%的数据,1≤n≤80 1≤s
所有数字均在longlong以内
首先,会个矩阵快速幂的板子,then,以样例一为例,满足2的矩阵为
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
then,根据1 交换第一列和第二列为1的行,
得到
1 0 0 0
0 0 1 0
0 0 0 1
0 1 0 0
对其进行 k 次快速幂,最后按有无1来输出a[i];
okok
#include
using namespace std;
//#pragma GCC optimize(2)
#define endl '\n'
#define lowbit(x) ((x)&-(x))
const int mod=1e9+7;
typedef long long ll;
ll ans=0,n1,m1;
ll t=0,s1=0,s2=0,s3=0,s4=0,max1=0,max2=0,w,min1=100000000,sum=0,n,m,i,j,k,v,l,r;
inline int read() {
bool sym=0;
int res=0;
char ch=getchar();
while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
return sym ? -res : res;
}
void print(int x) {
if(!x)return;
print(x/10);
putchar(x%10+'0');
}
int isPrime(int n) {
float n_sqrt;
if(n==1) return 0;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5; i<=n_sqrt; i+=6) {
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
ll a[107];
//矩阵快速幂
struct mm {
ll m[107][108];
} as,ass;
mm operator *(const mm&a,const mm&b ) {
mm c ;
memset(c.m ,0,sizeof c.m );
for(ll i=1; i<=n; i++) {
for(ll j=1; j<=n; j++) {
for(ll k=1; k<=n; k++) {
c.m [i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
}
}
return c;
}
mm qmm(mm a,ll k) {
mm ans;
memset(ans.m ,0,sizeof ans.m );
for(ll i=1; i<=n; i++)
ans.m [i][i]=1;
while(k) {
if(k&1)
ans=ans*a;
a=a*a;
k>>=1;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>s1>>s2>>k;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i