`
java4evero
  • 浏览: 47282 次
文章分类
社区版块
存档分类
最新评论
阅读更多


2011ACM北京网络预选赛 F Machine scheduling (BUPT 216)



这题比赛时候过得很纠结……最后还是学长过的……比赛时候脑子可能不够清楚,一直WA……
首先,这个题要分成两个部分解决:
第一部分:从n个东西里面取出r个,每个间距至少为 k (1~K不行,1~K + 1行)
第二部分:将这r个东西分成至多m组,可以有空组
第二部分貌似好久之前搞OI的时候干过……贴过来:

    
        
            
             N球放在M个盒子里,求共有多少种放法
            
             但是有3个不同的条件 :N个球是否相同,M个盒子是否相同,是否允许有盒子空着
            
            
                
                    
                        
                         球和球
                        
                        
                         盒和盒
                        
                        
                         空盒
                        
                        
                         情况数
                        
                    
                    
                        
                         有区别
                        
                        
                         有区别
                        
                        
                         有空盒
                        
                        
                         mn
                        
                    
                    
                        
                         有区别
                        
                        
                         有区别
                        
                        
                         无空盒
                        
                        
                         M!s(n,m)
                        
                    
                    
                        
                         有区别
                        
                        
                         无区别
                        
                        
                         有空盒
                        
                        
                         S(n,1)+s(n,2)+…+s(n,m),n>=m
                         S(n,1)+s(n,2)+&#8230;+s(n,n),n<=m
                        
                    
                    
                        
                         有区别
                        
                        
                         无区别
                        
                        
                         无空盒
                        
                        
                         S(n,m)
                        
                    
                    
                        
                         无区别
                        
                        
                         有区别
                        
                        
                         有空盒
                        
                        
                         C(n+m-1,n)
                        
                    
                    
                        
                         无区别
                        
                        
                         有区别
                        
                        
                         无空盒
                        
                        
                         C(n-1,m-1)
                        
                    
                    
                        
                         无区别
                        
                        
                         无区别
                        
                        
                         有空盒
                        
                        
                         F(m,n)
                        
                    
                    
                        
                         无区别
                        
                        
                         无区别
                        
                        
                         无空盒
                        
                        
                         F(m,n-m)
                        
                    
                
            
            
            
            
        
    

然后,其中的F(m,n)貌似是当时写过的一个DP,S(M,N)是第二类stirling数&#8230;&#8230;递推公式:1 int S(int n,int m) {2     if (n == m || m == 1) return 1;3     return m * S(n - 1, m) + S(n - 1, m - 1);4 }第一部分:可以看作这么一个生成函数的相关问题:由于每个东西之间都隔了>=K-1的一段距离,因此一个可行解可以看作,长度为K,K + 1,K + 2的棍子r - 1个(我们认为每个棍子的头是我们取的点),拼接成长度为Len的一个大段,之后再堵上一个,就是一个Len +1的可行解&#8230;&#8230;而r - 1根棍子,拼成长度为Len 的可行解数目,就是(X^K + X^(K + 1) + X^(K + 2) + .....) ^ (r - 1),这个多项式,展开之后,X^Len项前面的系数&#8230;&#8230;不过&#8230;&#8230;由于数据范围,直接搞是不成的&#8230;&#8230;于是提取,变形:X^(K * (r - 1))  * (1 + X + X^2 + X ^3 +....)^(r - 1)然后再变形:X^(K * (r - 1))  * (1/(1 - x))^(r - 1)&#8230;&#8230;然后参照Matrix67大神的日志,展开后面那项:1/(1-x)^n=1+C(n,1)x^1+C(n+1,2)x^2+C(n+2,3)x^3+...+C(n+k-1,k)x^k+...我们知道,要求长度为len的可行数目,也就是要X^Len项前面的系数,然后,由于前面提取出来了一个K * (r - 1),也就是去后面找len - K * (r - 1) 项的系数&#8230;&#8230;也就是说,令pow = len - K * (r - 1),答案就是C(r - 1 + pow - 1, pow)&#8230;&#8230;不过这还没完,因为咱们要拼成的长度是len,而总的长度是N,需要乘上这个长度len的开头位置的可能数&#8230;&#8230;另外还需要特殊处理:咱们在处理的时候,是先用r - 1个拼接成长度为Len的一个大段,再堵上最后一个&#8230;&#8230;当r == 1需要特判&#8230;&#8230;代码: 1 #include <cstdio> 2 #include <cstring> 3  4 typedef long long Long; 5 const Long MOD = 1000000007; 6  7 Long F[1010][1010]; 8 Long C[2010][2010]; 9 Long S(int n,int m) {10     if (n == m || m == 1) return 1LL;11     if (F[n][m] > 0) return F[n][m];12     return F[n][m] = (m * S(n - 1, m) % MOD + S(n - 1, m - 1)) % MOD;13 }14 void init() {15     for (int i = 0; i <= 2000; i++) {16         for (int j = 0; j <= i; j++) {17             if (j == 0) C[i][j] = 1;18             else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD;19         }20     }21 }22 int n,r,k,m;23 24 int main() {25     memset(F,0xff,sizeof(F));26     init();27     while (scanf("%d%d%d%d",&amp;n,&amp;r,&amp;k,&amp;m) > 0) {28         if (r == 1) {printf("%d\n",n); continue;}29         Long ans = 0;30         for (int i = 1; i <= m &amp;&amp; i <= r; i++) {31             ans = (ans + S(r,i)) % MOD;32         }33         Long tmp = 0;34         for (int len = k * (r - 1); len < n; len++) {35             int left = n - len;36             int pow = len - k * (r - 1);37             // r > 1 !!38             tmp = (tmp + left * C[r - 1 + pow - 1][pow]) % MOD;39         }40         ans = ans * tmp % MOD;41         printf("%lld\n",ans);42     }43     return 0;44 }



0
1
分享到:
评论

相关推荐

    第33届ACM亚洲区预选赛(杭州赛区)_网络选拔赛.rar

    【标题】"第33届ACM亚洲区预选赛(杭州赛区)_网络选拔赛"是针对ACM(国际大学生程序设计竞赛)的一次重要赛事,该赛事在亚洲区的预选赛中设定了杭州赛区的网络选拔环节。ACM比赛是全球范围内极具影响力的编程竞赛,...

    第29届ACM国际大学生程序设计竞赛亚洲区北京赛区预选赛试题题解(一)

    在本资源中,我们聚焦的是第29届ACM国际大学生程序设计竞赛亚洲区北京赛区预选赛的试题解析。ACM国际大学生程序设计竞赛(International Collegiate Programming Contest,简称ICPC或ACM竞赛)是一项享誉全球的编程...

    2011ACM黑龙江大学校赛

    2011ACM黑龙江大学校赛2011ACM黑龙江大学校赛2011ACM黑龙江大学校赛2011ACM黑龙江大学校赛2011ACM黑龙江大学校赛2011ACM黑龙江大学校赛

    辽宁省第三届ACMICPC网络预选赛(无密码).doc

    ### 辽宁省第三届ACMICPC网络预选赛知识点总结 #### 一、足球比赛越位判断(Football Game Offside Judgment) ##### 题目背景: 在一场由团队X对阵团队Y的足球比赛中,需要根据特定规则判断X队队员小A传球给队友...

    ACM成都赛区2012网络预选赛题解

    这是2012年成都市acm程序设计大赛预选赛的试题,供想参加acm竞赛的大学生使用!

    哈尔滨acm 预选赛题目

    宝贵的题目,试着做一下.2008年 ,哈尔滨acm 预选赛题目。

    哈尔滨acm预选赛题目

    2008年,哈尔滨acm 预选赛题目,大家试着做一下。

    2009ACM合肥赛区网络赛试题

    知识点:2009ACM合肥赛区网络赛试题——Another Door Repairing Problem 在深入解析这一问题之前,我们首先理解一下ACM/ICPC(Association for Computing Machinery / International Collegiate Programming ...

    09年ACM武汉大学网络赛试题

    【标题】"09年ACM武汉大学网络赛试题"涉及的是ACM(国际大学生程序设计竞赛,简称ICPC)的网络赛部分,这是一场由武汉大学主办的编程竞赛。ACM比赛是全球范围内影响力极大的编程竞赛,旨在锻炼大学生的算法设计、...

    2010年ACM福州赛区网络赛题目

    标题 "2010年ACM福州赛区网络赛题目" 和描述 "2010年ACM亚洲区预选赛福州赛区网络赛题目" 暗示了这是一场编程竞赛,具体是2010年ACM(国际大学生程序设计竞赛,简称ICPC)在福州赛区举行的网络选拔赛。这类比赛主要...

    2020ZJCPC_2020年_2020浙江acm省赛_省赛题目_浙江ACM_

    在全国范围内,ACM竞赛通常分为预选赛、区域赛、国家赛和世界总决赛等层次。省级比赛是预选赛的一部分,旨在筛选出优秀队伍晋级更高层级的比赛。浙江省作为中国计算机教育的重要地区,其省赛题目通常具有一定的代表...

    acm 武汉网络赛 测试数据 标程

    【标题】"ACM 武汉网络赛 测试数据 标程" 涉及的知识点主要集中在程序设计竞赛(ACM,即国际大学生程序设计竞赛)领域,特别是关于比赛的准备、测试数据的处理以及如何参考“标程”进行学习。 在ACM程序设计竞赛中...

    ACM-ICPC亚洲区预选赛命题经验谈

    ACM/ICPC竞赛概述:介绍了ACM/ICPC竞赛的规模、影响力、题目形式、赛制和中国大陆赛区的命题现状。 题目要求:详细讨论了构成一道好题目的条件,包括题面和数据的正确性、题目描述的易于理解性、数据的强度、代码量...

    33届ACM杭州区域赛

    【33届ACM杭州区域赛】是国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ICPC)的一部分,这是一个备受瞩目的年度赛事,旨在挑战大学生在算法设计、编程速度和问题解决能力上的...

    北京大学ACM题库、北京大学ACM源码、浙江大学ACM源码

    【北京大学ACM题库、北京大学ACM源码、浙江大学ACM源码】 这些资源是针对ACM(International Collegiate Programming Contest,国际大学生程序设计竞赛)的训练材料,旨在帮助学生提升算法设计、编程技巧和问题解决...

    航芯ACM32F403_Datasheet_V1.6.pdf

    上海航芯ACM32F403芯片是一款基于ARMv8-M架构的高性能32位SoC芯片,支持Cortex-M33和Cortex-M4F指令集。它的最高系统工作频率可以达到180MHz,支持浮点运算和DSP。ACM32F403芯片内置了NVIC中断控制器、8通道DMA...

    2011年10月23日北邮ACM比赛题目

    北邮(北京邮电大学)ACM比赛是针对计算机编程竞赛的一项重要活动,旨在培养学生的算法设计、编程和问题解决能力。2011年10月23日的北邮ACM比赛题目,作为训练材料,对于参赛者或者对算法有兴趣的学者来说,是一份...

    2011 ACM 多校联合 2011 MU11 13 FZU

    【标题】"2011 ACM 多校联合 2011 MU11 13 FZU" 指的是一项编程竞赛,ACM(国际计算机学会)每年都会举办多场这样的竞赛,旨在提升学生的算法设计和编程能力。ACM竞赛通常包括一系列的编程题目,参赛队伍需要在限定...

    2010ACM选拔赛2010ACM选拔赛

    【标题解析】:“2010ACM选拔赛2010ACM选拔赛” 这个标题显然是指2010年举办的一场ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)的选拔赛,可能是一个地区性的...

Global site tag (gtag.js) - Google Analytics