CodeForces - 1091D New Year and the Permutation Concatenation (打表)

🤹‍♂️ 🤹‍♂️ 🤹‍♂️
首先可以写出来这样的打表代码:

vi x,y;
inline void solve(int n)
{
    x.clear();y.clear();
    rpp(i,n) x.push_back(i);
    do
    {
        for(auto i:x) y.push_back(i);
    } while (next_permutation(all(x)));
    rep(i,sz(y)) if(i) y[i]+=y[i-1];
    int ans=1;
    for(int i=n;i<sz(y);++i) if(y[i]-y[i-n]==(n+1)*n/2) ++ans;
    cout<<"i:"<<n<<"    "<<"ans:"<<ans<<endl;
}
signed main()
{
    for(int i=1;i<=10;++i)
    {
        solve(i);
    }
    stop;
    return 0;
}

不过由于太暴力,只能计算前十个
在这里插入图片描述打完之后观察,很容易推得满足题意的数组由两部分组成:n!个排列 + 不同排列各截取一部分,然后我们从打的表中把n!取出再看规律
在这里插入图片描述

#define int ll
#define mod 998244353

int ans[MX];
signed main()
{
    ans[1]=1,ans[2]=2,ans[3]=9;
    int tag=6;
    for(int i=4;i<=1e6;++i) 
    {
        tag=tag*i%mod;
        ans[i]=(((ans[i-1]-1)%mod*i)%mod+tag)%mod;
    }
    int n;cin>>n;
    cout<<ans[n]<<endl;
    stop;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值