为了方便,对于集合$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. 【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。

    新工作.Net和Java都要做,早期也做过一段Java的项目,但没有系统的深入学习过.一直觉得这两门语言估计是最相近的两门语言了,好多代码可以说直接拷过来都不带报错的,但仔细推敲还是有很多的不同. 1 ...

  2. 2020.12.3--vj个人赛补题

    A Vasya studies music.He has learned lots of interesting stuff. For example, he knows that there are ...

  3. 2020.5.17--牛客小白月赛25 F.疯狂的自我检索者

    F.疯狂的自我检索者 链接:https://ac.nowcoder.com/acm/contest/5600/F来源:牛客网 牛妹作为偶像乐队的主唱,对自己的知名度很关心.她平时最爱做的事就是去搜索引 ...

  4. 实用 | 利用 aardio 配合 Python 快速开发桌面应用

    1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开发一款 PC ...

  5. NX9.0和NX10.0做自定义操作可以用的函数

    NX9.0:LIBUFUNX.DLL int UF_OPER_ask_check_geom(void *,int *,unsigned int * *) int UF_OPER_ask_first_o ...

  6. 按键检测GPIO输入

    1. 项目 通过按键控制开关LED灯,按下按键灯亮,再按一下灯灭. 2. 代码 mian.c #include "stm32f10x.h" //相当于51单片机中的 #includ ...

  7. Less-(38~41) 堆叠注入

    首先申明,Less-(38~41)可以采取和Less-(1~4)相同的解法:(一一对应) 然而,他们的漏洞其实更大,我们可以做更多具有破坏性的事情. 代码审计: Less-(38~41): 41的$s ...

  8. 【c++ Prime 学习笔记】第13章 拷贝控制

    定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...

  9. 关于takin-data,你想知道的都在这里(一)启动命令篇

    通过docker部署体验takin的小伙伴都应该知道,在安装部署手册中有提到:在启动surge-deploy任务前,需要将启动命令中的ip参数替换为docker容器所在宿主机的ip,很多小伙伴都在这里 ...

  10. pagelayout中边界灵敏度动画时间kv

    <PageLayoutWidget>: # 默认是50dp 设置边界 border:'100dp' # 默认哪一页 page:2 # 设置翻页动画及持续时间 anim_kwargs:{'d ...