首页 > 其他分享 >OCPC2023 I. DAG Generation

OCPC2023 I. DAG Generation

时间:2024-08-13 15:40:32浏览次数:13  
标签:DAG OCPC2023 方式 Generation res ll 生成 include

题目传送门

题意

给你一种DAG生成方式,问生成两张DAG相同的概率是多少。

生成方式为,一开始有\(A,B\)两个集合,A为空集,B中有\(1-n\)每个节点,每次从B中随机取出一个点,然后在A中随机取出一个子集,把子集中的每个点往B中取出的点连一条有向边,然后把取出点放入A。

题解

我们不妨认为第一次生成取出点的顺序就是1,2,3.......n,第二次任意顺序取出点,题目转化为这两次生成相同的概率。显然取出点的顺序不同还是有可能生成同一张图。

对于第\(i\)个取出的点,它可以对前\(i-1\)个点选或者不选连边,一共有\(2^{i-1}\)种不同的选择,所以对于图1,一共有\(2^0*2^1...+2^{n-1}\)种不同的生成方式,每一种生成方式出现的概率是完全相同的,图2在图1的基础上,取出点顺序是不确定, 每一种取点顺序都有那么多生成方式,总的生成方式数就是\(2^0*2^1...+2^{n-1}*n!\), 两个图一起生成,就有\((2^0*2^1...+2^{n-1})^2*n!\)种不同的生成方式.

所以答案就是两张图一起生成时的

\[\frac{两张图相同的生成方式数}{总生成方式数} = \frac{两张图相同的生成方式数}{(2^0*2^1...+2^{n-1})^2*n!} \]

因为每一种不同的生成方式等概率出现.

分母已经知道,关键时分子怎么求, 自然想到我们可以对于图1的每一种生成方式,算出图2种有多少生成方式可以生成同样的图,然后求和就好了。但是这个东西并不好求,由于图2的一种生成方式最多对应图1的一种方式,因为图1不同方式生成的图一定不同, 所以我们考虑反过来计算图2 种有多少生成方式可以在图1中找到对应。

于是问题就转化成了,图2有多少生成方式可以生成一张DAG,使得DAG中的每一个点只存在由编号比它小的点到达的有向边。

考虑这个东西可以dp,\(F_i\)表示\(i\)个点有多少生成方式,然后考虑插入\(i+1\)号点转移,我们先枚举插入的位置,前面已经有\(i\)个数,一共有\(i+1\)种不同的插入位置,不同的插入位置对应图2生成时不同的取点顺序,然后再乘上插入的这个点的决策数,由于插入的这个点比之前所有点都大,所以可以选择任意的比它先取出的点,如果这个点插入j位置,那么就说明前\(j-1\)个点都可以选,一共\(2^{j-1}\)方案。所以对于任意一个\(i\)个点的生成方案,插入\(i+1\)号点后一共会有$(20+21....+2^i)种不同方案,有:

\[F_i = (2^0 + 2^1 + 2^2....2^{i-1})F_{i-1} \]

而这就是分子。


实现

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cstdlib>
#define ll long long
using namespace std;

int read(){
    int num=0, flag=1; char c=getchar();
    while(!isdigit(c) && c!='-') c=getchar();
    if(c == '-') flag=-1, c=getchar();
    while(isdigit(c)) num=num*10+c-'0', c=getchar();
    return num*flag;
}

const ll mod = 1e9+9;
const int N = 1e5+1000;

ll ksm(ll x, ll k){
    if(k == 0) return 1;
    if(k == 1) return x;
    ll res = ksm(x, k/2); res=res*res%mod;
    if(k%2) res = res*x%mod;
    return res;
}

ll add2[N], mul2[N], fac[N];
ll F[N];

int main(){
    fac[0]=1; for(int i=1; i<N; i++) fac[i] = fac[i-1]*i%mod;
    add2[0]=1; mul2[0]=1;
    for(int i=1; i<N; i++) add2[i] = (add2[i-1] + ksm(2, i))%mod;
    for(int i=1; i<N; i++) mul2[i] = (mul2[i-1] * ksm(2, i))%mod;

    F[1] = 1;
    for(int i=2; i<N; i++) F[i] = F[i-1]*add2[i-1]%mod;

    int T =  read();
    while(T--){
        ll n=read();
        ll ans = F[n] * ksm(mul2[n-1]*mul2[n-1]%mod*fac[n]%mod, mod-2) %mod;
        ans = (1-ans)%mod + mod;
        printf("%lld\n", ans%mod);
    }
    
    return 0;
}

标签:DAG,OCPC2023,方式,Generation,res,ll,生成,include
From: https://www.cnblogs.com/ltdjcoder/p/18357047

相关文章

  • Program Code Generation with Generative AIs 代码生成
    这篇文章是一篇学术论文,标题为《ProgramCodeGenerationwithGenerativeAIs》,由BaskhadIdrisov和TimSchlippe撰写,发表在《Algorithms》期刊的2024年第17卷上,文章编号为62。文章主要探讨了使用生成性人工智能(GenerativeAIs)生成程序代码的正确性、效率和可维护性,并将这些指......
  • 《Advanced RAG》-10-Corrective Retrieval Augmented Generation (CRAG)
    摘要CRAG设计了一个轻量级检索评估器,用于评估针对特定查询检索到的文档的整体质量,并使用网络搜索作为改进检索结果的辅助工具。CRAG可与基于RAG的各种方法无缝集成,并提供了一个插件式的解决方案。CRAG的主要思想是引入一个检索评估器,用于评估检索文档与查询之间的关......
  • airflow DAG/PIPELINE examples reference
    data-pipelines-with-apache-airflowhttps://github.com/BasPH/data-pipelines-with-apache-airflowCodeforDataPipelineswithApacheAirflowhttps://www.manning.com/books/data-pipelines-with-apache-airflowAsuccessfulpipelinemovesdataefficiently,mi......
  • Python_DAG-有向无环图-igraph
    DAG-有向无环图-igraph安装pipinstallpython-igraphpipinstallpycairopiplist发现Python安装的有igraph包有两个:igraph、python-igraph有向图 有向图(Digraph)是图论中的一种图结构,其中的边(弧)具有方向性,表明从一个节点(顶点)到另一个节点的单向关系。与无向图不同,无向......
  • RAG(Retrieval-Augmented Generation)优化
    RAG流程RAG是通过检索来增强生成模型的能力:将用户的查询与检索过程中获取的文档见解直接整合到prompt里,输入给语言模型。基本流程如下:加载并解析文档切割文档为文本片段文本片段向量化(embeddings)embeddings存入数据库用户Query->检索数据库->带有检索结果信息的Prom......
  • 这可能是本年度最好用的 Dagger2 使用教程 三(依赖注入器的依赖、子组件、Lazy、Provid
    在上一个文章中,我们介绍了Dagger中的限定和范围注解,现在我们将视线转移到依赖注入器来,先介绍这个组件的依赖的两种方式,再介绍两个常用的类型。强烈建议先看完上一个文章:这可能是最详细的Dagger2使用教程二(限定注解@Named、@Qulifier和范围注解@Singleton、@Scope)......
  • 工作流-workflow_Dagster or Prefect介绍
    工作流预定工作流动态工作流根据具体的需求和场景选择合适的工作流引擎进行使用Dagster生态PrefectPrefect是一种新的工作流管理系统动态工作流程:Prefect允许用户创建可以基于输入数据或条件进行更改的动态工作流程Prefectisaworkfloworchestrationframewor......
  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • Prompt Selection and Augmentation for Few Examples Code Generation in Large Lang
    本文是LLM系列文章,针对《PromptSelectionandAugmentationforFewExamplesCodeGenerationinLargeLanguageModelanditsApplicationinRoboticsControl》的翻译。大语言模型中少数示例代码生成的提示选择与增强及其在机器人控制中的应用摘要1引言2相......
  • Calibrating Large Language Models Using Their Generations Only
    本文是LLM系列文章,针对《CalibratingLargeLanguageModelsUsingTheirGenerationsOnly》的翻译。仅使用它们的生成来校准大型语言模型摘要1引言2相关工作3方法4实验5讨论6结论摘要随着大型语言模型(LLM)越来越多地部署在面向用户的应用程序中,通过......