为了方便,对于集合$S$,称$k\equiv S(mod\ M)$当且仅当存在$x\in S$使得$k\equiv x(mod\ M)$

枚举红绿灯,对每一个点即限制$k$对$g_{i}+r_{i}$取模后的结果,同时相邻两个红绿灯限制相差是$o(1)$的,即可以提取出以下这个模型——

$n$次操作,每次操作给定$M$和$S\subseteq [0,M)$,新增限制$k\not\equiv S(mod\ M)$

每次操作后,求随机整数$k$满足当前所有限制的概率

数据范围为$1\le n\le 500$,$1\le M\le 100$

令$X=2^{3}\times 3^{2}\times 5\times 7$,那么$\forall 1\le M\le 100,\frac{M}{\gcd(M,X)}$为一个素数的幂次或1

枚举随机整数$k$对$X$取模的余数$a$($0\le a<X$),求出在满足给定限制下还满足$k\equiv a(mod\ X)$的概率,将这些概率累加即为答案

令$k=a+tX$,问题即变为对于随机整数$t$,$a+tX$满足所有限制的概率,代入后限制$k\not\equiv S(mod\ M)$即可转换为$\frac{X}{g}t\not\equiv S'(mod\ \frac{M}{g})$

(其中$g=\gcd(M,X)$,$S'=\{\frac{x}{g}\mid (g\mid x)\and (x+a\equiv S(mod\ M))\}$)

由于$\gcd(\frac{M}{g},\frac{X}{g})=1$,再令$S'$所有元素乘上$\frac{X}{g}$在模$\frac{M}{g}$意义下的逆元,即$t\not\equiv S'(mod\ \frac{M}{g})$

根据$X$的性质,$\frac{M}{g}$必然是素数的幂次或1,假设是$p$的幂次,不妨转换为$p^{\lfloor\log_{p}100\rfloor-ord_{p}(X)}$,此时相同素数的幂次必然都相同,直接对$S'$求并即可

(从同余的角度更容易理解此过程,但不同余方便实现)

最终,模数两两互素,每一个概率相乘即为答案

时间复杂度每一次都需要$o(MX)$去转化这个限制,总复杂度即$o(nMX)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define X 2520
5 struct del{
6 int i,P,x;
7 };
8 vector<int>v;
9 vector<del>v_del;
10 int n,x,r,g,p[N],visp[N],phi[N],tot[X][N],vis[X][N][N];
11 double ans;
12 int gcd(int x,int y){
13 if (!y)return x;
14 return gcd(y,x%y);
15 }
16 int pow(int n,int m,int mod){
17 int s=n,ans=1;
18 while (m){
19 if (m&1)ans=ans*s%mod;
20 s=s*s%mod;
21 m>>=1;
22 }
23 return ans;
24 }
25 void add(int p,int m,vector<int>v){
26 int g=gcd(m,X),mm=m/g,P=mm,inv=pow(X/g,phi[mm]-1,mm);
27 if (P%2==0)P=8;
28 if (P%3==0)P=9;
29 for(int i=0;i<X;i++)
30 for(int j=0;j<v.size();j++){
31 int x=(v[j]-i%m+m)%m;
32 if (x%g)continue;
33 x=x/g*inv%mm;
34 for(int k=0;k<P/mm;k++)
35 if (!vis[i][P][k*mm+x]){
36 tot[i][P]++;
37 vis[i][P][k*mm+x]=1;
38 if (p)v_del.push_back(del{i,P,k*mm+x});
39 }
40 }
41 ans=0;
42 for(int i=0;i<X;i++){
43 double s=1;
44 for(int j=1;j<=100;j++)s*=1.0*(j-tot[i][j])/j;
45 ans+=s;
46 }
47 while (v_del.size()){
48 del o=v_del.back();
49 tot[o.i][o.P]--;
50 vis[o.i][o.P][o.x]=0;
51 v_del.pop_back();
52 }
53 }
54 int main(){
55 phi[1]=1;
56 for(int i=2;i<N;i++){
57 if (!visp[i]){
58 p[++p[0]]=i;
59 phi[i]=i-1;
60 }
61 for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
62 visp[i*p[j]]=1;
63 if (i%p[j])phi[i*p[j]]=phi[i]*phi[p[j]];
64 else{
65 phi[i*p[j]]=phi[i]*p[j];
66 break;
67 }
68 }
69 }
70 scanf("%d",&n);
71 for(int i=1;i<=n;i++){
72 scanf("%d%d%d",&x,&r,&g);
73 v.clear();
74 for(int j=0;j<r+g;j++)
75 if ((j+x)%(r+g)>=r)v.push_back(j);
76 add(1,r+g,v);
77 printf("%.9f\n",ans/X);
78 v.clear();
79 for(int j=0;j<r+g;j++)
80 if ((j+x)%(r+g)<r)v.push_back(j);
81 add(0,r+g,v);
82 }
83 printf("%.9f",ans/X);
84 }

[gym102511K]Traffic Blights的更多相关文章

  1. ICPC World Finals 2019 题解

    [A]Azulejos 题意简述: 有两排瓷砖,每排都有 \(n\) 个,每个瓷砖有高度 \(h_i\) 和价格 \(p_i\) 两种属性. 你需要分别重新排列这两排瓷砖,使得同一排的瓷砖满足价格不降 ...

  2. ZJOI2019Round#2

    乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v​\)使得两棵树中\((u,v)​\)距离的和最大. ...

  3. Linux下按程序查实时流量 network traffic

    实然看到下载速度多达几M/s,但实际上并没有什么占用带宽的进程. 相查看每个程序占用的网络流量, 但系统自带的 System Monitor 只能查看全局的流量, 不能具体看某个程序的...... k ...

  4. Windows Azure Traffic Manager (5) Traffic Manager Overview

    <Windows Azure Platform 系列文章目录> 笔者默默地看了一下之前写的Traffic Manager内容,已经差不多是3年前的文章了.现在Azure Traffic M ...

  5. Windows Azure Traffic Manager (6) 使用Traffic Manager,实现本地应用+云端应用的高可用

    <Windows Azure Platform 系列文章目录> 注意:本文介绍的是使用国内由世纪互联运维的Azure China服务. 以前的Traffic Manager,背后的Serv ...

  6. 流量工程 traffic engineering (TE)

    什么是流量工程 流量工程是指根据各种数据业务流量的特性选取传输路径的处理过程.流量工程用于平衡网络中的不同交换机.路由器以及链路之间的负载. [编辑] 流量工程的内容 流量工程在复杂的网络环境中,控制 ...

  7. snmp switch traffic交换机带宽

    上代码 <?php function getstr1($strall,$str1,$str2,$html_charset='utf-8'){ $i1=mb_strpos($strall,$str ...

  8. 每日英语:The Secret About Online Ad Traffic: One-Third Is Bogus

    Billions of dollars are flowing into online advertising. But marketers also are confronting an uncom ...

  9. Traffic Lights

    Traffic Lights time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

随机推荐

  1. Linux安装配置Java

    先从 Oracle 官网下载 Java 运行 tar -zxvf xxxx.tar.gz 指令将 Java 解压到 /usr/local/java 下(个人习惯,无所谓) 修改环境变量 vim /et ...

  2. 数据库MySQL主从-GTID

    1.第一步在主服务器上/etc/my.cnf/下添加 log-bin=log-bin server-id=1 gtid_mode=ON enforce_gtid_consistency 2.第二步:重 ...

  3. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力

    ​ 飞桨 (PaddlePaddle) 以百度多年的深度学习技术研究和业务应用为基础,是中国首个自主研发.功能完备. 开源开放的产业级深度学习平台,集深度学习核心训练和推理框架.基础模型库.端到端开发 ...

  4. bash手册

    目录 bash手册 man命令 man man 分页程序(page) Linux手册页惯用的节名 Linux手册页的内容区域 查看命令在Linux手册页中的区域 info页面 help帮助 bash手 ...

  5. java实现责任链模式的小demo

    //一个请假请求 public class LeaveRequest { private int leaveDays; private String name; public void leave() ...

  6. 用C++实现的数独解题程序 SudokuSolver 2.4 及实例分析

    SudokuSolver 2.4 程序实现 本次版本实现了 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析 里发现的第三个不完全收缩 grp 算法 thirdGreenWor ...

  7. [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎

    [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 目录 [源码解析] Pytorch 如何实现后向传播 (1)---- 调用引擎 0x00 摘要 0x01 前文回顾 1.1 训 ...

  8. 通过简单例子 | 快速理清 UML 中类与类的六大关系

    关于封面:我想我们都会离开 类与类之间的六大关系 泛化 ( Generalization ) ---> 表继承关系 实现 ( Realization ) 关联 ( Association ) 聚 ...

  9. RabbitMQ设计原理解析

    背景 RabbitMQ现在用的也比较多,但是没有过去那么多啦.现在很多的流行或者常用技术或者思路都是从过去的思路中演变而来的.了解一些过去的技术,对有些人来说可能会产生众里寻他千百度的顿悟,加深对技术 ...

  10. [no code][scrum meeting] Alpha 13

    项目 内容 会议时间 2020-04-21 会议主题 OCR技术对接会议 会议时长 45min 参会人员 全体成员 $( "#cnblogs_post_body" ).catalo ...