首页 > 其他分享 >[省选联考 2024] 重塑时光

[省选联考 2024] 重塑时光

时间:2024-03-28 21:23:16浏览次数:23  
标签:排列 省选 sum 2024 int edge ans 联考 MOD

[省选联考 2024] 重塑时光

因为太弱了而感觉网上过的题解都不够详细清晰!所以写了篇题解!

估计也会成为我后面给初中的学弟学妹们讲题的题目之一,前提是没有其他人要选它

首先,肯定要将概率转为方案数

若我们已经将一个排列划分成了\(k+1\)块(有空的)且已经重新拼接成了一条新的时间线,这些块中有\(i\)个非空的,那么此时这中情况的贡献,也就是这个情况对应的原排列和切割方式的方案数为\(i!k!C_{k+1}^i\),\(i!\)是原排列中这\(i\)组可以以任意顺序排列,\(k!\)是\(k\)刀可以以任意序列排列,\(C_{k+1}^i\)是剩下的\(k+1-i\)个空块和这\(i\)个非空块在被切割的原排列中是以任意顺序排列的,最后得到的答案再除以一个\((n+k)!\)即可

那么现在来考虑如何求出 将一个排列划分成了k+1块(有空的)且已经重新拼接成了一条新的时间线,这些块中有i个非空的的方案数,设其为\(f_i\)

先说一个很重要的点,若我们已经得到了一个\((k+1)\)段序列,且已经重新拼接成了一条新的时间线,考虑如何判断其是否合法,显然,对原图中有先后顺序要求的边连有向边\((u,v)\),只要当前新的时间线中,每个块中不存在后面的点连向前面的点的边,并且将每个块缩成一个点,这些缩点间不存在后面的点连向前面的点的边,就是合法的

直接求肯定是不好求的,但是发现这里的限制是 恰好i个非空块,那么可以考虑容斥,先求出 至少i个非空块之类的,但是发现这个也不好弄,主要的原因就是,仅仅只是 i个非空块的限制,转移的时候无论怎样都会算重,当然,不排除\(wtcl\)不会做的可能,考虑加强限制,设\(g_{S,i}\)表示将集合\(s\)中的点分成至少\(i\)个独立块(块与块之间没有边)的方案数,这个好求,只需要借助一个\(h_S\)表示将集合\(S\)分到一个块中的所有排列的方案数,只需要满足不存在后面的点连向前面的点的边即可,这个也好求,只需要每次枚举第一个放到这个排列的第一个的点即可,那么\(g_{S,i}=\sum_{T\subseteq S} [!edge(S/T,T)\&\&!edge(T,S/T)]g_{S/T,i-1}h_{T}\)

那么将\(f_i\)也扩展成\(f_{S,i}\),则有\(f_{S,i}=\sum_{T\subseteq S}[!edge(T,S/T)]\sum_{j=0}^i f_{S/T,i-j}g_{T,j}(-1)^{j+1}\)

直接做是\(O(3^nn^2)\)的,考虑优化,发现\(\sum_{j=0}^i\)的部分其实就是卷积的形式,直接\(ntt\)常数大,过不了,考虑另一种转为点值的形式:拉格朗日插值法

则原式可以表示为\(F_S=\sum_{T\subseteq S}[!edge(T,S/T)] F_{S/T}G_{T}\),其中\(F_S(x)=\sum_{i=0}^n f_{S,i}x^i\),\(G_T\)同理

因为\(n\)次的只需要\(n+1\)个不同的\(x\)值代入\(F_S(x)\)中就可以解出其它\(x\)值的\(F_S(x)\)或是\(F_S(x)\)每一项的系数,所以只需要将\(1\sim n+1\)代入,然后求出对应的\(F_S(x)\)即可

最后,\(F_S(x)\)的每一项的系数就是我们要求的\(f_{S,i}\),所以现在只剩下如何拉格朗日插值求多项式系数

因为我们只需要\(S=(1<<n)-1\)的\(F_S(x)\)的系数,所以下文省略掉\(S\)这个下角标

若我们当前已经求得了\(n+1\)种不同\(x\)的\(F(x)\)的值,那么考虑构造\(n+1\)个多项式,设其为\(Q_i(x)\),要求\(F(x)=\sum Q_i(x)\),要求\(Q_i(x)=F(i)\),那么只需要将这\(n+1\)个多项式相加就可以得到\(F(x)\)的多项式系数了,而\(Q_i(x)\)只需要按照拉格朗日插值中的方法构造即可,即\(Q_i(x)=F(i)\frac{\prod_{j=1\&\&j\neq i}^{n+1}x-j}{\prod_{j=1\&\&j\neq i}^{n+1} i-j}\),\(F(i)\)和分母都是常数,设\(p(x)=\sum_{j=1}^{n+1}x-j\),则分子可以表示为\(\frac{p(x)}{x-i}\),若分子的\(x^t\)的系数为\(k_t\),\(p(x)\)的为\(a_t\),手模一下这个除法,可以发现\(k_t=a_t+i\times k_{t+1}\)

然后就可以了,复杂度为\(O(3^NN+2^NN^2)\)

#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
void add(int &x,int y){ x+=y; if(x>=MOD) x-=MOD; if(x<0) x+=MOD; }
int ad(int x,int y){ x+=y; if(x>=MOD) x-=MOD; if(x<0) x+=MOD; return x; }
int power(int x,int y){
    int ans=1;
    for(;y;y>>=1,x=1ll*x*x%MOD) if(y&1) ans=1ll*ans*x%MOD;
    return ans;
}
int n,m,k,ans;
int vis[20],edge[1<<15],jc[40],invf[40];
int h[1<<15],g[1<<15][16];
int fp[20],fv[1<<15],gv[1<<15];
int a[20],b[20],f[20];
void Init(){
    jc[0]=1;
    for(int i=1;i<=n+k;++i) jc[i]=1ll*jc[i-1]*i%MOD;
    invf[n+k]=power(jc[n+k],MOD-2);
    for(int i=n+k-1;~i;--i) invf[i]=1ll*invf[i+1]*(i+1)%MOD;
}
int solve(int x){
    for(int s=0;s<(1<<n);++s){
        gv[s]=0;
        for(int i=0,now=1;i<=n;++i,now=1ll*now*x%MOD){
            if(i+1&1) add(gv[s],-1ll*now*g[s][i]%MOD);
            else add(gv[s],1ll*now*g[s][i]%MOD);
        }
    }
    fv[0]=1;
    for(int s=1;s<(1<<n);++s){
        fv[s]=0;
        for(int t=s;t;t=(t-1)&s) if(!(edge[t]&(s^t))) add(fv[s],1ll*fv[s-t]*gv[t]%MOD);
    }
    return fv[(1<<n)-1];
}
int main(){
    scanf("%d%d%d",&n,&m,&k),Init();
    for(int i=1,u,v;i<=m;++i) scanf("%d%d",&u,&v),vis[u]|=(1<<v-1);
    for(int s=1;s<(1<<n);++s) for(int i=1;i<=n;++i) if(s>>i-1&1) edge[s]|=vis[i];
    h[0]=1; for(int s=1;s<(1<<n);++s) for(int i=1;i<=n;++i) if((s>>i-1&1)&&!(vis[i]&(s^(1<<i-1)))) add(h[s],h[s^(1<<i-1)]);
    g[0][0]=1;
    for(int s=1,pos;s<(1<<n);++s){
        for(int i=1;i<=n;++i) if(s>>i-1&1) pos=i;
        for(int t=s;t;t=(t-1)&s) if(!(edge[s^t]&t)&&!(edge[t]&(s^t))&&(t>>pos-1&1)) for(int i=1;i<=n;++i) add(g[s][i],1ll*g[s^t][i-1]*h[t]%MOD);
    }
    a[0]=1;
    for(int i=1;i<=n+1;++i){
        fp[i]=solve(i);
        for(int j=i;~j;--j) a[j]=ad(j?a[j-1]:0,-1ll*i*a[j]%MOD);
    }
    for(int i=1,res;i<=n+1;++i){
        res=1ll*fp[i]*invf[i-1]%MOD*invf[n+1-i]%MOD;
        if((n+1-i)&1) res=ad(0,-res);
        for(int j=0;j<=n+1;++j) b[j]=a[j];
        for(int j=n+1;j;--j) add(f[j-1],1ll*res*b[j]%MOD),add(b[j-1],1ll*i*b[j]%MOD);
    
    }
    for(int i=0;i<=k+1;++i) add(ans,1ll*f[i]*jc[k]%MOD*jc[k+1]%MOD*invf[k+1-i]%MOD);
    printf("%d\n",1ll*ans*invf[n+k]%MOD);
    return 0;
}

标签:排列,省选,sum,2024,int,edge,ans,联考,MOD
From: https://www.cnblogs.com/LuoyuSitfitw/p/18102652

相关文章

  • 2024年3月28日-UE5-地图触发器,摄像机控制,后期盒子,关卡蓝图
    在全局蓝图里加一句简单的话测试下 然后选打印输入一句话 新建一个触发框 调整位置 然后改名 创建一个平面放到之前触发框的位置 选中关卡触发器,然后打开关卡蓝图然后右键点击,然后选第一个,为这个关卡触发器添加逻辑   当ACTOR进入触发器区域,输出前......
  • 新增文章(2024-3-28)
    //controllerpackagecom.di.bigevent.controller;importcom.di.bigevent.pojo.Article;importcom.di.bigevent.pojo.Result;importcom.di.bigevent.service.ArticleService;importcom.di.bigevent.utils.JwtUtil;importjakarta.servlet.http.HttpServletResponse......
  • 2024天府杯全国大学生数学建模A题思路+模型+代码+论文
    2024天府杯数学建模竞赛A题思路模型代码:3.28第一时间更新,更新见文末名片A题:科研绩效分配方案设计与优化问题背景:科学研究领域的绩效评定有着较大的共性和行业典型特点,在高校科研人员日常管理工作中也是一项较复杂的研究性、政策性工作。科技部、教育部、......
  • 展望2024
    PHP程序员展望2024:技术趋势与职业发展随着2023年的结束,我们站在了2024年的起点上,作为PHP程序员,我们不仅要关注技术的最新发展,还要思考如何将这些变化融入我们的职业生涯中。在这篇博客中,我将与大家分享我对2024年PHP技术趋势和职业发展的展望。一、技术趋势:创新与发展并行PHP......
  • 16,2024年Python大厂面试分享
    6.3.路由6.3.1.配置分布式路由在tedu_note/urls.py中,将所有user/***相关路由转交给user处理fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path(‘admin/’,admin.site.urls),path(‘user/’,include(‘user.urls’))......
  • 20240328每日一题题解
    20240328每日一题题解摘要本文对于2024年3月28日的每日一题进行了问题重述,并将问题拆解为五个步骤,分别进行了详细的讨论与求解,实现了整型与字符串类型的互相转换。并且还指出,在编写C++程序时,需要观察数据范围,在有必要时使用长整型(longlong)存储数据,以免出现整型溢出现象。关键......
  • 2024最新最全Java和Go面经,面试了30多场,终于上岸了!
    ​>本文来自我们技术交流群群友的投稿,未经授权,禁止转载。原文链接:太难了,Java和Go,面试了30多场,终于上岸了!先听一下TA的故事2023年10月份我就做好了离职跳槽的准备,做了3年Java后端开发的我,对自己的技术能力还是很有底气的。之前虽不是一线大厂,也算是比较知名的中厂了。加上前公......
  • 2024 VEXIQ 赛季笔(游)记 Pt.1
    2024/03/07老师让我们做机器初步思考了。搞搞戒指,只要一个小夹子加上赛季的抬升吸环改一下就可以了,方便的一批。于是夹子10分钟不到搞完了,现在是缝合怪时间。但是老师下课不让我搞了/kk。2024/03/14学校pi-day为什么不给pi吃?学校pi-day为什么不给pi吃?学校pi-day......
  • 【专题】2024年3月数字化行业报告合集汇总PDF分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35531原文出处:拓端数据部落公众号在科技浪潮的推动下,人工智能行业正在经历着前所未有的变革与发展。从自然语言处理到数字社交,再到AI数字人、绿色智能制造等多个领域,人工智能正逐渐渗透到我们生活的各个角落。然而,这一过程中也伴随着新的挑战和问......
  • dubhe2024 BuggyAllocator:通过修改_IO_2_1_stdout_的内容进行任意读
    在堆题中遇到没有show()函数的情况,导致无法泄露地址。这时可以通过修改_IO_2_1_stdout_来强制程序输出一段内存,从而泄露需要的地址。例题:dubhe2024BuggyAllocatordubhe2024,xctf分站赛最后一场凄惨爆零,主看了这道题一整天,逆清楚了但找不到漏洞。事后来看当时就算找到洞了也不会......