1 条题解
-
0
题目传送门
思路:
首先观察对排列的三种操作,发现总共就 种状态,所以考虑打表预处理。
由于反转与取反的代价形如 。而求逆不增加新形式,所以对于代价 有:
$$s_3:(N(y),N(x))\longrightarrow \sum (n+1-i)^{n+1-p_i}$$ $$s_7:(N(x),N(y))\longrightarrow \sum (n+1-p_i)^{n+1-i}$$然后对于状态转移 也只有 种,继续打表就好啦:
最后处理就简单啦。
std:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MOD=998244353; int cal(ll base, int exp) { ll res=1; base%=MOD; while(exp>0) { if(exp&1) res=(res*base)%MOD; base=(base*base)%MOD; exp>>=1; } return (int)res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n,q; cin>>n>>q; vector<int> p(n); for(int i=0;i<n;i++) cin>>p[i]; vector<ll> s(8,0); for(int i=1;i<=n;i++) { int x=i; int y=p[i-1]; int nx=n+1-x; int ny=n+1-y; ll v0=cal(y,x); ll v1=cal(y,nx); ll v2=cal(ny,x); ll v3=cal(ny,nx); ll v4=cal(x,y); ll v5=cal(nx,y); ll v6=cal(x,ny); ll v7=cal(nx,ny); s[0]=(s[0]+v0)%MOD; s[1]=(s[1]+v1)%MOD; s[2]=(s[2]+v2)%MOD; s[3]=(s[3]+v3)%MOD; s[4]=(s[4]+v4)%MOD; s[5]=(s[5]+v5)%MOD; s[6]=(s[6]+v6)%MOD; s[7]=(s[7]+v7)%MOD; } int tra[8][3]={ {1,2,4}, {0,3,5}, {3,0,6}, {2,1,7}, {6,5,0}, {7,4,1}, {4,7,2}, {5,6,3} }; int cur=0; for(int i=0;i<q;i++) { int op; cin>>op; cur=tra[cur][op-1]; cout<<s[cur]<<" "; } return 0; }作者的话:
求过求赞,打表很累的qwq。
- 1
信息
- ID
- 12574
- 时间
- 1000ms
- 内存
- 700MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者