P5550 Chino的数列

题目背景

没有背景

我写不出来了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

你可能感兴趣的:(算法,c++,数据结构)