ARC176D 做题记录
考场被创死了。
套路,枚举值域
然后拆贡献,考虑每个位置
于是同一个组合的贡献是一样的,我们统计出四种组合各有多少个,然后矩阵快速幂算方案数。
反思:
考场上想了很多,想过
但是却往
想
还是想题不够老练,思路不够清晰,做题和比赛不够有经验。
菜就多练,但是一定要练!
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define pir pair<ll,ll>
#define mkp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
const ll maxn=2e5+10, mod=998244353;
ll n,m,a[maxn],b[maxn],cnt0,cnt1,cnt2,ans;
struct mat{
ll dat[3][3];
const mat operator* (const mat t) const{
mat res;
for(ll i=0;i<3;i++)
for(ll j=0;j<3;j++)
res.dat[i][j]=(dat[i][0]*t.dat[0][j]+dat[i][1]*t.dat[1][j]
+dat[i][2]*t.dat[2][j])%mod;
return res;
}
}base, ret;
int main(){
scanf("%lld%lld",&n,&m);
cnt2=n-1;
for(ll i=1;i<=n;i++) scanf("%lld",a+i), b[a[i]]=i; ll tot=(n-1)*n/2%mod;
for(ll i=1;i<n;i++){
ll x=b[i];
if(x>1){
if(a[x-1]<i) --cnt1, ++cnt0;
else --cnt2, ++cnt1;
}
if(x<n){
if(a[x+1]<i) --cnt1, ++cnt0;
else --cnt2, ++cnt1;
}
base.dat[0][1]=2*(n-i)%mod, base.dat[0][0]=(tot+mod-2*(n-i)%mod)%mod;
base.dat[1][0]=i-1, base.dat[1][2]=n-i-1, base.dat[1][1]=(tot-(n-2)+mod)%mod;
base.dat[2][1]=2*i%mod, base.dat[2][2]=(tot+mod-2*i%mod)%mod;
base.dat[2][0]=base.dat[0][2]=0;
ret.dat[0][0]=ret.dat[0][1]=ret.dat[0][2]=
ret.dat[1][0]=ret.dat[1][1]=ret.dat[1][2]=
ret.dat[2][0]=ret.dat[2][1]=ret.dat[2][2]=0;
ret.dat[0][0]=ret.dat[1][1]=ret.dat[2][2]=1;
ll t=m;
while(t){
if(t&1) ret=ret*base;
base=base*base; t>>=1;
}
ll p=(cnt0*ret.dat[0][1]+cnt1*ret.dat[1][1]+cnt2*ret.dat[2][1])%mod;
ans=(ans+p)%mod;
} printf("%lld",ans);
return 0;
}
出处:https://www.cnblogs.com/Sktn0089/p/18151203
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】