题目链接

https://atcoder.jp/contests/agc032/tasks/agc032_f

题解

神仙题。。
第一步转化利用了\(\frac{1}{3}\)这个数特有的性质。假设我们用红线标出每一次切割的位置,再在每一次切割的位置顺时针\(120\)度处用蓝线标出,那么答案就等于红线与蓝线之间的最小夹角。但是这样转化完了依然不好做(而且似乎也没用到\(\frac{1}{3}\)的特殊性),那么考虑如果在每一次切割的位置逆时针\(120\)度处用绿线标出,答案依然是不变的,因为\(|x-\frac{1}{3}|=|(1-x)-\frac{2}{3}|\). 那样我们就相当于将整个圆周分成了\(3\)等份(每一等份记作\(\frac{1}{3}\)),考虑其中的一份,每次在其中随机一个位置随机三种颜色中的一种画上线(初始时在\(0\)处有一条红线\(\frac{1}{3}\)处有一条蓝线),答案等于不同颜色之间最短距离的期望。
不算首尾一共撒了\((n-1)\)个点,将\([0,\frac{1}{3}]\)分成了\(n\)份。考虑如何算两端为不同颜色的份(下称“不同色段”)的最短长度的期望。
首先考虑一个弱化版问题: 没有颜色的限制,用\((k-1)\)个点把\([0,1]\)分成\(k\)份,最小的一份的期望长度。考虑答案大于等于\(t\)的概率,也就相当于\(n\)个随机实数和为\(1-kt\)的概率除以\(n\)个随机实数和为\(1\)的概率,也就是\((n-1)\)个随机实数和不超过\(1-kt\)的概率除以\((n-1)\)个随机实数和不超过\(1\)的概率,显然等于\((1-kt)^{k-1}\). 那么对其进行积分,\(\int^\frac{1}{k}_0(1-kt)^{k-1}\text{d}t=\frac{1}{k}\int^1_0(1-t)^{k-1}dt=\frac{1}{k}\int^1_0t^{k-1}\text{d}t=\frac{1}{k^2}\). 并且把\([0,1]\)换成\([0,L]\)推一下可知答案关于\(L\)是线性的,即\(\frac{L}{k^2}\).
对于有颜色限制的情况,考虑枚举不同色段的个数,分成两部分:(1)出现这种情况的概率;(2)在这种情况下答案的期望。对于(2),显然不同色段的总长度期望为\(\frac{k}{3n}\), 因为上面问题的答案关于总长度是线性的,因此答案的期望即为\(\frac{1}{3nk}\)。对于(1),可以用一个DP乘以组合数来求出,DP不同色段的个数,组合数插入同色段。
总时间复杂度\(O(n)\).

代码

#include<bits/stdc++.h>
#define llong long long
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int N = 1e6;
const llong P = 1e9+7;
const llong INV3 = 333333336ll;
llong fact[N+3],finv[N+3];llong quickpow(llong x,llong y)
{llong cur = x,ret = 1ll;for(int i=0; y; i++) {if(y&(1ll<<i)) {ret = ret*cur%P; y-=(1ll<<i);} cur = cur*cur%P;}return ret;
}
llong comb(llong x,llong y) {return x<0||y<0||x<y?0ll:fact[x]*finv[y]%P*finv[x-y]%P;}llong f[N+3][3];
int n;void updsum(llong &x,llong y) {x = x+y>=P?x+y-P:x+y;}int main()
{fact[0] = 1ll; for(int i=1; i<=N; i++) fact[i] = fact[i-1]*i%P;finv[N] = quickpow(fact[N],P-2); for(int i=N-1; i>=0; i--) finv[i] = finv[i+1]*(i+1)%P;scanf("%d",&n);f[0][0] = 1ll;for(int i=1; i<=n; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) {if(k!=j) updsum(f[i][j],f[i-1][k]);}llong ans = 0ll;for(int i=1; i<=n; i++){llong cur = f[i][1]*comb(n,i)%P*finv[i]%P*fact[i-1]%P; updsum(ans,cur);}ans = ans*finv[n]%P*fact[n-1]%P*quickpow(INV3,n)%P;printf("%lld\n",ans);return 0;
}

AtCoder AGC032F One Third (组合计数、DP、概率期望、微积分)相关推荐

  1. AtCoder AGC036C GP 2 (组合计数)

    题目链接 https://atcoder.jp/contests/agc036/tasks/agc036_c 题解 终于有时间补agc036的题了. 这题其实不难的来着--我太菜了考场上没想出来 首先 ...

  2. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  3. AtCoder AGC035F Two Histograms (组合计数、容斥原理)

    题目链接 https://atcoder.jp/contests/agc035/tasks/agc035_f 题解 B题难度的F题--然而我还是不会 假设第\(i\)行染的长度是\(a_i\), 第\ ...

  4. bzoj2111,P2606-[ZJOI2010]排列计数【Lucas,组合计数,dp】

    正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2111 https://www.luogu.org/problem/P2606 题 ...

  5. hdu-5781 ATM Mechine(dp+概率期望)

    题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  6. UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)

    UOJ #214 合唱队形 (概率期望计数.DP.Min-Max容斥) 9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/ ...

  7. 《算法竞赛进阶指南》数论篇(3)-组合计数,Lucas定理,Catalan数列,容斥原理,莫比乌斯反演,概率与数学期望,博弈论之SG函数

    文章目录 组合计数 例题:Counting swaps Lucas定理 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)C_n^m\equiv C_{n\ mod\ p}^{m\ mod\ ...

  8. CF1237F Balanced Domino Placements(组合计数,dp)

    CF1237F Balanced Domino Placements Solution 显然可以先考虑横着的骨牌,再考虑竖着的骨牌.但是思路卡在了选取横着的骨牌会对竖着的骨牌的相邻对数产生影响. 然而 ...

  9. 算法竞赛入门10.2计数与概率基础例题代码

    10.6 Irrelevant Elements UVA1635 思路:基础组合计数 #include<cstdio> #include<cstring> #include&l ...

最新文章

  1. kotlin + springboot 整合redis,Redis工具类编写及单元测试
  2. 制作Python的安装模块
  3. DeepMind将博弈论融入多智能体研究,让纳什均衡变得更简单
  4. VTK:平行坐标视图用法实战
  5. 【转】C++/CLI简介(什么是C++/CLI) -------C++/CLI 编程系列一
  6. MySQL Cluster 用户权限共享 (各sql节点同步)
  7. 【ES6(2015)】Function函数
  8. 自定义异常 java
  9. JAVA里面pressed的反义词_pressed是什么意思_pressed怎么读_pressed翻译_用法_发音_词组_同反义词_紧缺的-新东方在线英语词典...
  10. 33.go 错误处理
  11. linux内核分析和应用 -- 进程与线程(上)
  12. 超效率dea matlab,MATLAB在超效率DEA模型中的应用
  13. 一个Log系统,客户端运行起来,排除那些可以输出(编辑器文件)
  14. Android PackageInstaller:安装应用的应用,从三流Android外包到秒杀阿里P7
  15. TD041S485H完全兼容ISO3080, ISO3086 ISO3082, ISO3088
  16. 远程控制软件TeamViewer轻松解决企业运维难题
  17. 与大学生谈学习BIM软件开发所需要的准备
  18. LocalDate 向后推几个月的日期如何计算
  19. 90后在校大学生开旅游公司创业
  20. postgresql安装所需函数插件(比如加密函数hamc()函数使用)

热门文章

  1. 台湾大学林轩田机器学习技法课程学习笔记4 -- Soft-Margin Support Vector Machine
  2. VTK修炼之道30:图像重采样_降采样和升采样技术
  3. 利用WinRAR命令行压缩文件或文件夹2007-11-14 15:07压缩文件夹
  4. 程序员的光荣与梦想——论侠客梦的延续与幻灭
  5. 【内网安全】域横向PTHPTKPTT哈希票据传递
  6. Build path entry is missing 导致项目不编译。
  7. 如何在 Linux 中使用 find
  8. hdu-2066(Dijkstra)
  9. 以太坊智能合约安全入门了解一下(上)
  10. paddlepaddle系列之三行代码从入门到精通