[gym102511K]Traffic Blights
为了方便,对于集合$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的更多相关文章
- ICPC World Finals 2019 题解
[A]Azulejos 题意简述: 有两排瓷砖,每排都有 \(n\) 个,每个瓷砖有高度 \(h_i\) 和价格 \(p_i\) 两种属性. 你需要分别重新排列这两排瓷砖,使得同一排的瓷砖满足价格不降 ...
- ZJOI2019Round#2
乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v\)使得两棵树中\((u,v)\)距离的和最大. ...
- Linux下按程序查实时流量 network traffic
实然看到下载速度多达几M/s,但实际上并没有什么占用带宽的进程. 相查看每个程序占用的网络流量, 但系统自带的 System Monitor 只能查看全局的流量, 不能具体看某个程序的...... k ...
- Windows Azure Traffic Manager (5) Traffic Manager Overview
<Windows Azure Platform 系列文章目录> 笔者默默地看了一下之前写的Traffic Manager内容,已经差不多是3年前的文章了.现在Azure Traffic M ...
- Windows Azure Traffic Manager (6) 使用Traffic Manager,实现本地应用+云端应用的高可用
<Windows Azure Platform 系列文章目录> 注意:本文介绍的是使用国内由世纪互联运维的Azure China服务. 以前的Traffic Manager,背后的Serv ...
- 流量工程 traffic engineering (TE)
什么是流量工程 流量工程是指根据各种数据业务流量的特性选取传输路径的处理过程.流量工程用于平衡网络中的不同交换机.路由器以及链路之间的负载. [编辑] 流量工程的内容 流量工程在复杂的网络环境中,控制 ...
- snmp switch traffic交换机带宽
上代码 <?php function getstr1($strall,$str1,$str2,$html_charset='utf-8'){ $i1=mb_strpos($strall,$str ...
- 每日英语: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 ...
- Traffic Lights
Traffic Lights time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
随机推荐
- Python - __all__ 变量
import * 当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线 _ 或者双下划线 __ )开头的变量.函数和类 因此,如果不想模块文件中的某个对象被引入到其它文件中使用,可 ...
- linux主机互信操作
一.主机互信原理两个主机之间ssh登录需要提示输入对方的密码,当频繁需要登录操作时,可以通过linux公钥和秘钥,建立双机信任关系.把你源主机的公钥文件内容追加到目的主机对应用户下的authorize ...
- Centos7最小安装后快速初始化脚本
功能说明 服务器通常使用最小化安装操作系统,使用该脚本可快速初始化一些基本配置,包括以下: 1.ssh修改默认端口 2.ssh禁止root登陆 3.selinux及firewalld禁用 4.hist ...
- 写学习abcde的简单AI(C++实现)
#include <iostream> #include <time.h> #include <stdlib.h> #include <cmath> u ...
- 苹果的最新MacbookPro,炸到你了么?
一 苹果秋季发布会如期而至.我不是一个标准的果粉.但是我今年用上了macbook pro m1,最期待的就是新款的搭载了M1X的Macbook. 苹果官方也放出了要炸翻全场的宣传语... 这次发布会围 ...
- git 更新与图形界面
git 软件更新:git update-git-for-windows 或者 git update gitk 是一个历史记录的图形化查看器. 使用:只需 cd 到一个 Git 仓库,然后键入:gitk ...
- clock时钟
①时钟的偏移(skew):时钟分支信号在到达寄存器的时钟端口过程中,都存在有线网等延时,由于延时,到达寄存器时钟端口的时钟信号存在有相位差,也就是不能保证每一个沿都对齐,这种差异称为时钟偏移(cloc ...
- 分享一份软件测试项目实战(web+app+h5+小程序)
大家好,我是谭叔. 本次,谭叔再度出马,给大家找了一个非常适合练手的软件测试项目,此项目涵盖web端.app端.h5端.小程序端,可以说非常之全面. 缘起 在这之前,谭叔已经推出了九套实战教程. 但是 ...
- Python课程笔记(七)
今天学习神奇的海龟,非常有意思,还有很多图片想去绘制,分享一个turtle绘图网站: https://www.python123.io/index/turtles/latest , 要是可以分享出源码 ...
- windows下安装dirmap详细教程
今天安装一下dirmap,纯小白非常详细的安装过程 1.先去下载dirmap 下载地址:https://github.com/H4ckForJob/dirmap 点这个绿色的code,然后再点下面这个 ...