码迷,mamicode.com
首页 > 其他好文 > 详细

【日记】1.8

时间:2020-01-13 23:41:17      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:cti   efi   思路   ons   多少   int   its   init   不同   

1.8

DP

1.CF1091D:给定n,所有n的排列字典序从小到大排序,问有多少个子串满足是1-n的排列。

思路:实际上每次看相邻两个排列的第一个不同的数的位置,根据这个特征进行计数。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define mid ((l+r)>>1)
#define db(x) cout<<#x<<":"<<x<<endl;
const int M=1e6+20,P=998244353;
struct TTTT{
    int n;
    LL Inv[M];
    void init(){
        scanf("%d",&n);
        Inv[0]=Inv[1]=1;
        for(int i=2;i<=n;++i)
            Inv[i]=(P-P/i)*Inv[P%i]%P;
    }
    void run(){
        init();
        LL ans=n,sum=1LL*n*(n-2)%P;
        for(int i=2;i<=n;++i)
            ans=(ans+sum*i%P)%P,sum=sum*Inv[n-i]%P*(n-i+1)%P*(n-i-1)%P;
        printf("%lld\n",ans);
    }
}TTT;
int main(){
    TTT.run();
    return 0;
}

【日记】1.8

标签:cti   efi   思路   ons   多少   int   its   init   不同   

原文地址:https://www.cnblogs.com/diorvh/p/12189777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!