首页 > 其他分享 >2..3...4.... Wonderful! Wonderful! 题解

2..3...4.... Wonderful! Wonderful! 题解

时间:2024-02-26 18:12:51浏览次数:27  
标签:... 删掉 int 题解 ll 元素 Wonderful infect

2..3...4.... Wonderful! Wonderful!

题目描述

​ 有一个元素等于其下标的数组,长度为n,对于属于区间\([1,(n-1)/2]\)的每一个数,我们称其为k,我们可以对数组进行任意次数的操作。

​ 操作:选择长度为\(2*k+1\)的子序列,然后只留下最中间的那个数,删掉其他的元素。

​ 我们想知道对于每个\(k\),操作后,最后有多少个可能得到的数组。

数据范围

​ \(t\)组数据,每组就一个\(n\),$n $的总和不大于\(1e6\)。

解法

​ 我们设x为总共要删掉的数量,会发现最后能得到的数组,有以下特征。

​ 1,x为\(2k\)的倍数,这一点显然。

​ 2,存在一个元素,它的两边有至少k个要删掉的元素。

​ 我们证明以下,对于2中存在的元素,我们看他的两边,如果一两边的数量大于k,我们就一定能选择一个元素作为删除操作中的中心元素,然后成功删掉大于k的部分元素。过了一段时间后,就会出现只剩下\(2k\)个元素的情况,然后就能一次删掉了。

​ 搞清楚以上的局面,我们需要再发现,正面求出这些还是很困难的,于是我们求出总数\(C(n,x)\)后,再减去不合法的即可。需要注意的是, x是要枚举的,但x为2k的倍数,所以其复杂度为调和级数。

​ 现在我们先将要删掉的元素排成一排,然后往里面插入那些不删掉的。想要不合法,全向左右两边的\(k-1\)个元素扎入即可。于是问题就转化成了有n-x个相同的小球,要插入2k个相同盒子,允许盒子有空的,问有多少种情况。答案就是\(C(n-x+2*k-1,2*k-1)\)。这里为什么小球和盒子都是相同的呢?因为元素的顺序是已经定下的。

代码实现

const int mod=998244353;
const int maxn=1000010;
int fect[maxn], infect[maxn];
ll binpow(ll a,ll b,ll c){
    ll ans=1;
    while(b){
        if(b&1)
        ans=(Int)ans*a%c;
        a=(Int)a*a%c;
        b>>=1;
    }
    return ans;
}
int C(int a,int b){
    return fect[a]*infect[b]%mod*infect[a-b]%mod;
}
void initzuhe(int n){
    fect[0]=1;
    infect[0]=1;
    for(int i=1;i<=n;i++){
        fect[i]=(fect[i-1]*i)%mod;
    }
    infect[n]=binpow(fect[n],mod-2,mod);
    for(int i=n-1;i>=1;i--)
    infect[i]=infect[i+1]*(i+1)%mod;
}
ll cul(int n,int k){
    ll ans=0;
    for(int x=2ll*k;x<=n;x+=2ll*k){
        ans=(ans+C(n,x)-C(n-x-1+2ll*k,2ll*k-1)+mod)%mod;
    }
    return ans;
}
void solve(){
    int n;cin>>n;
    for(int k=1;k<=(n-1)/2ll;k++)cout<<(cul(n,k)+1ll)%mod<<" ";
    cout<<"\n";
}
signed main(){
    std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
    initzuhe(1000000);
    //srand((unsigned)time(NULL));
    int t;std::cin>>t;while(t--)
    solve();
}

标签:...,删掉,int,题解,ll,元素,Wonderful,infect
From: https://www.cnblogs.com/shi5/p/18034882

相关文章

  • QT多线程实现-----问题解决及实现方式
    一、概述恰巧正在做一个多线程通信的项目,具体功能是与下位机交互和文件发送,在子线程中实现命令发送和文件传输。使用movetothread主要遇到以下几个问题:1.Socketnotifierscannotbeenabledordisabledfromanotherthread。2.子线程完成文件传输,发送信号......
  • P1119 灾后重建题解
    目录思路代码\(原题传送门\)思路首先先来分析一下算法,Floyd算法的时间复杂度是\(O(n^3)\)虽然很多,但在这一题里很合适。dijkstra算法用堆优化的时间复杂度是\(O(m\logn)\),在这一题里会超时。Bellman–Ford算法的时间复杂度是\(O(mn)\),会超时。所以说这一题是能用Flo......
  • 2024牛客寒假算法基础集训营6 K 错综的统一 题解
    Question2024牛客寒假算法基础集训营6K错综的统一一个矩阵仅由"r",“e”,“d”组成一个矩阵区域是美丽的,当且仅当:在矩形区域内,任意横向或纵向取一个长度大于\(1\)的连续字串是,该字符串都不是回文的现在有\(Q\)次询问,每次给定一个矩阵,问最少修改多少字符(字符只能修改"r"......
  • LG5290/LOJ3052 春节十二响 题解(启发式合并)
    考虑当这个东西是一条链的时候我们该怎么做,显然\(1\)​会有两个儿子,然后两个儿子分别是一条链。所以我们可以给两个儿子的链上的所有节点分别加到两个堆里,每次取出两个堆的最大值加入到我们选择的答案中,然后把两个堆的最大值全部pop掉。最终的答案就是我们pop完一个堆之后,......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • P1975 [国家集训队] 排队 题解
    题目链接:排队水紫,\(n\)不大,树套树或者分块都能做。分块的话,最优序列分块套套值域分块最优。观察到是可差性问题维护,即权值数量维护,那我们就树状数组套权值线段树即可。由于\(n\)不大,我们可以不用回收标记,直接数组空间开大点就行。我们预处理出初始逆序对,每一次操作都是基于......
  • MySQL备份恢复数据--binary-mode is enabled and mysql is run in non-interactive...
    使用mysqldump;MySQL自带的逻辑备份工具。mysqldump[选项]数据库名[表名]>脚本名mysqldump[选项]--数据库名[选项表名]>脚本名mysqldump[选项]--all-databases[选项]>脚本名备份mysqldump-hlocalhost-uwordpress-pwordpress_20200104>c......
  • mysql access denied for root ... mysqld –skip-grant-tables 命令失效 ... Failed
    <!--密码突然登录不上MySQL了,久了也不晓得是不是密码不正确...只能改密码...一年难得碰一次,感觉每次总有莫名其妙的问题--><!--修改方案只找到一个,就是无密码验证开启mysql服务,然后登录,设置新密码--><!--mysql版本不同有些命令无效,大概分高低两版本--><!--低版命令我......
  • 2024牛客寒假算法基础集训营6 H 纷乱的红线 题解
    Question2024牛客寒假算法基础集训营6H纷乱的红线小红拿到了一个圆,以及平面上有\(n\)个点(保证没有三点共线)。现在小红将随机取\(3\)个点画一个三角形,她想知道这个三角形和圆的交点数量的期望是多少?Solution考虑到\(n\le1000\)可以枚举每一条线,计算这一条线和圆的交......
  • AT_abc213_d [ABC213D] Takahashi Tour 题解(图&深搜)
    传送门题意有一个\(n\)个点的无向图。从根节点\(1\)开始,按如下规则遍历整个图:如果有连接这个点的其他点没有走过,则到这个点。如果有多个点,那么按从小到大的顺序走。如果有这个点没有其他点或者连接这个点的其他点都走过了,那么:如果这个点是根节点\(1\),结束。否则回......