[atAGC050E]Three Traffic Lights
原题意可能略微有一些复杂,这里给出简述的题意——
给定$g_{i}$和$r_{i}$(其中$1\le i\le 3$),求有多少个整数$t$满足:
$0\le t< \prod_{i=1}^{3}(g_{i}+r_{i})$且$\forall 1\le i\le 3,t\ mod\ (g_{i}+r_{i})<g_{i}$,答案对998244353取模
$1\le g_{i},t_{i}\le 10^{12}$
先来叙述一些关于同余的性质——
性质1:$x\equiv y(mod\ n)$,可推出$x\equiv y(mod\ d)$(其中$d$为$n$的任意约数)
性质2:关于$t$的同余方程$\forall 1\le i\le k,t\equiv x_{i}(mod\ m_{i})$,若其有解$t_{0}$,则$t$为其解当且仅当$t\equiv t_{0}(mod\ M)$,其中$M=lcm(m_{1},m_{2},...,m_{k})$
证明:
充分性——根据性质1,$t\equiv t_{0}(mod\ M)$即可推出$t\equiv t_{0}\equiv x_{i}(mod\ m_{i})$
必要性——$t$为解即有$t\equiv t_{0}(mod\ m_{i})$,也可以写作$m_{i}\mid |t-t_{0}|$,即整除其最小公倍数$M$
定义六元组$(m_{1},x_{1},m_{2},x_{2},m_{3},x_{3})$合法,当且仅当存在$t$使得$\forall 1\le i\le 3,t\equiv x_{i}(mod\ m_{i})$
另外定义$n$中$p$的指数为$ord_{p}(n)$,即$\max_{a\ge 0,p^{a}\mid n}a$
关于$(m_{1},x_{1},m_{2},x_{2},m_{3},x_{3})$合法的一些性质——
(为了方便,记$M=lcm(m_{1},m_{2},m_{3})$,初始的这个六元组写作原六元组)
根据对称性,以下性质都写作修改$m_{1}$,事实上对$m_{2}$或$m_{3}$都是类似的
性质3:对于素数$p$满足$p\mid m_{1}$且$p\not\mid m_{2},m_{3}$,则原六元组合法等价于$(\frac{m_{1}}{P},x_{1},m_{2},x_{2},m_{3},x_{3})$合法(其中$P=p^{ord_{p}(m_{1})}$)
证明:
原六元组若合法,则其$t$也可以作为新的六元组的解(根据性质1),即新的六元组必然合法
若新的六元组合法,对于其解$t_{0}$,考虑构造原六元组的解$t_{1}$
首先$t_{1}$必然要是新六元组的解,即$t_{1}\equiv t_{0}(mod\ \frac{M}{P})$
再要求$t_{1}\equiv x_{1}(mod\ P)$,由于$\gcd(\frac{M}{P},P)=1$,根据性质3仍然存在$t_{1}$合法
根据$t_{1}$为新六元组的解有$t_{1}\equiv x_{1}(mod\ \frac{m_{1}}{P})$,再根据$t_{1}\equiv x_{1}(mod\ P)$,在这个同余方程中$x_{1}$显然为一组解,因此即得到$t_{1}\equiv x_{1}(mod\ m_{1})$,$t_{1}\equiv x_{2}(mod\ m_{2})$和$t_{1}\equiv x_{3}(mod\ m_{3})$根据$t_{1}$是新六元组的解即显然
性质4:对于素数$p$满足$ord_{p}(m_{1})\le ord_{p}(m_{2})$,则原六元组合法等价于$x_{1}\equiv x_{2}(mod\ P)$且$(\frac{m_{1}}{P},x_{1},m_{2},x_{2},m_{3},x_{3})$合法(其中$P=p^{ord_{p}(m_{1})}$)
证明:
原六元组若合法,根据$P\mid m_{1},m_{2}$即有$t\equiv x_{1}\equiv x_{2}(mod\ P)$,即要求$x_{1}\equiv x_{2}(mod\ P)$,且其$t$也可以作为新六元组的解,即新的六元组必然合法
当$x_{1}\equiv x_{2}(mod\ P)$且新六元组合法,对于其解$t_{0}$,有$t_{0}\equiv x_{2}\equiv x_{1}(mod\ P)$,再根据$t_{0}\equiv x_{1}(mod\ \frac{m_{1}}{P})$即可推出$t_{0}\equiv x_{1}(mod\ m_{1})$
同时$t_{0}\equiv x_{2}(mod\ m_{2})$和$t_{0}\equiv x_{3}(mod\ m_{3})$根据$t_{1}$是新六元组的解即显然,因此$t_{0}$也是原六元组的一组解,即原六元组合法
性质5:对于素数$p$,记$d_{i}=ord_{p}(m_{i})$,若有$d_{1}>\max(d_{2},d_{3})$,则原六元组合法等价于$(\frac{m_{1}}{p^{d_{1}-\max(d_{2},d_{3})}},x_{1},m_{2},x_{2},m_{3},x_{3})$合法
证明:
这即性质3和4的一个推论,具体来说——
根据性质4,原六元组合法等价于$x_{1}\equiv x_{2}(mod\ p^{d_{2}})$、$x_{1}\equiv x_{3}(mod\ p^{d_{3}})$以及$(m_{1},x_{1},\frac{m_{2}}{p^{d_{2}}},x_{2},\frac{m_{3}}{p^{d_{3}}},x_{3})$合法
再根据性质3,最后的这个六元组又等价于$(\frac{m_{1}}{p^{d_{1}-\max(d_{2},d_{3})}},x_{1},\frac{m_{2}}{p^{d_{2}}},x_{2},\frac{m_{3}}{p^{d_{3}}},x_{3})$合法
再根据性质4(将等价的两边交换),原六元组合法等价于$(\frac{m_{1}}{p^{d_{1}-\max(d_{2},d_{3})}},x_{1},m_{2},x_{2},m_{3},x_{3})$合法,即所求证
分析完这些性质后,我们回到原问题——
记$l_{i}=g_{i}+r_{i}$,$T=\prod_{i=1}^{3}l_{i}$,$L=lcm(l_{1},l_{2},l_{3})$,答案即
$$
\sum_{\forall 1\le i\le 3,0\le x_{i}<g_{i}且(l_{1},x_{1},l_{2},x_{2},l_{3},x_{3})合法,t为其一组解}\sum_{0\le j<T,j\equiv t(mod\ L)}1
$$
注意到在$[0,T)$中,恰好存在$\frac{T}{L}$个模$L$的完系,因此即
$$
\sum_{\forall 1\le i\le 3,0\le x_{i}<g_{i}且(l_{1},x_{1},l_{2},x_{2},l_{3},x_{3})合法}\frac{T}{L}
$$
现在我们仅关心于其是否合法,与其对应的解无关,因此可以根据性质5来调整$l_{1}$、$l_{2}$和$l_{3}$,调整后这三个数中每一个素数的指数较大的两个必然相等,因此最终一定可以被表示为$l_{1}=gab$、$l_{2}=gac$且$l_{3}=gbc$
(例如对于素数$p$,记$d_{i}=ord_{p}(l_{i})$,若$d_{1}=d_{2}\ge d_{3}$,令$g=p^{d_{3}}$且$a=p^{d_{1}-d_{3}}$即可)
关于合法,实际上也可以看作统计在$[0,gabc)$中满足其三个条件的解数(合法时恰好为1,不合法即为0),然后再调换枚举顺序,先去枚举每一组解,即
$$
\sum_{i=0}^{gabc-1}\prod_{j=1}^{3}\sum_{0\le k<g_{j},k\equiv i(mod\ l_{j})}\frac{T}{L}=\frac{T}{L}\sum_{i=0}^{gabc-1}\prod_{j=1}^{3}(\lfloor\frac{g_{j}}{l_{j}}\rfloor+[i\ mod\ l_{j}<g_{j}\ mod\ l_{j}])
$$
(注意$L\ne gabc$,所以这里所发生的变化并没有那么简单)
将后面这3个括号拆开,总共是8项,其中$\lfloor\frac{g_{j}}{l_{j}}\rfloor$为常数项,比较容易处理,这里直接考虑三项都是后面的非常数项的情况(一项或两项都类似)
此时,我们换一个角度去看待此问题:令$S_{j}=\{i\mid i\ mod\ l_{j}<g_{j}\ mod\ l_{j}\}$,即求$|S_{1}\cap S_{2}\cap S_{3}|$
关于$S_{j}$,也即$\bigcup_{0\le i<gabc,i\mid l_{j}}[i,i+g_{j}\ mod\ l_{j})$,也就是$\frac{gabc}{l_{j}}$个区间,不妨假设$a\le b\le c$,由于$l_{i}\le \max$,也即有$a,b\le \sqrt{\max}$,换言之$S_{2}$和$S_{3}$仅有$o(\sqrt{\max})$个区间,求交后也只有这么多
枚举其中的每一个个区间,统计$S_{1}$中对应的元素个数即可,复杂度为$o(\sqrt{\max})$,可以通过
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define ll long long
5 #define mod 998244353
6 #define fi first
7 #define se second
8 vector<pair<ll,ll> >v2,v3,v;
9 int T,s,ans,p[N],vis[N],d[4];
10 ll L,n,l[4],g[4],big[4];
11 ll gcd(ll x,ll y){
12 if (!y)return x;
13 return gcd(y,x%y);
14 }
15 int qpow(int n,int m){
16 int s=n,ans=1;
17 while (m){
18 if (m&1)ans=1LL*ans*s%mod;
19 s=1LL*s*s%mod;
20 m>>=1;
21 }
22 return ans;
23 }
24 int tot(ll x,ll y){
25 if (x/l[1]==y/l[1])return max((min(y%l[1],g[1]%l[1])-x%l[1]),0LL)%mod;
26 int s1=(max(g[1]%l[1]-x%l[1],0LL)+min(g[1]%l[1],y%l[1]))%mod;
27 int s2=(y/l[1]-x/l[1]-1)%mod*(g[1]%l[1]%mod)%mod;
28 return (s1+s2)%mod;
29 }
30 int main(){
31 for(int i=2;i<N;i++){
32 if (!vis[i])p[++p[0]]=i;
33 for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
34 vis[i*p[j]]=1;
35 if (i%p[j]==0)break;
36 }
37 }
38 T=L=1;
39 for(int i=1;i<=3;i++){
40 scanf("%lld%lld",&g[i],&l[i]);
41 l[i]+=g[i];
42 T=1LL*T*(l[i]%mod)%mod;
43 big[i]=l[i];
44 for(int j=1;j<=p[0];j++)
45 while (big[i]%p[j]==0)big[i]/=p[j];
46 }
47 for(int i=1;i<=3;i++){
48 bool flag=0;
49 for(int j=1;j<i;j++)
50 if (big[i]==big[j])flag=1;
51 if (!flag)L=1LL*L*(big[i]%mod)%mod;
52 for(int j=i+1;j<=3;j++)
53 if (big[i]==big[j])flag=1;
54 if (!flag)l[i]/=big[i];
55 }
56 for(int i=1;i<=p[0];i++){
57 d[1]=d[2]=d[3]=0;
58 for(int j=1;j<=3;j++){
59 ll k=l[j];
60 while (k%p[i]==0){
61 d[j]++;
62 k/=p[i];
63 }
64 }
65 for(int j=0;j<max(max(d[1],d[2]),d[3]);j++)L=1LL*L*p[i]%mod;
66 if (d[1]>max(d[2],d[3]))
67 for(int j=0;j<d[1]-max(d[2],d[3]);j++)l[1]/=p[i];
68 if (d[2]>max(d[1],d[3]))
69 for(int j=0;j<d[2]-max(d[1],d[3]);j++)l[2]/=p[i];
70 if (d[3]>max(d[1],d[2]))
71 for(int j=0;j<d[3]-max(d[1],d[2]);j++)l[3]/=p[i];
72 }
73 if (l[1]>l[2]){
74 swap(l[1],l[2]);
75 swap(g[1],g[2]);
76 }
77 if (l[1]>l[3]){
78 swap(l[1],l[3]);
79 swap(g[1],g[3]);
80 }
81 if (l[2]>l[3]){
82 swap(l[2],l[3]);
83 swap(g[2],g[3]);
84 }
85 ll G=gcd(gcd(l[1],l[2]),l[3]),a=gcd(l[1],l[2])/G,b=gcd(l[1],l[3])/G,c=gcd(l[2],l[3])/G;
86 n=G*a*b*c;
87 for(int i=1;i<=3;i++)d[i]=g[i]/l[i]%mod;
88 for(ll i=0;i<n;i+=l[2])v2.push_back(make_pair(i,i+g[2]%l[2]));
89 for(ll i=0;i<n;i+=l[3])v3.push_back(make_pair(i,i+g[3]%l[3]));
90 for(int i=0,j=0;i<v2.size();i++){
91 if (j)j--;
92 while ((j<v3.size())&&(v3[j].fi<v2[i].se)){
93 ll x=max(v2[i].fi,v3[j].fi),y=min(v2[i].se,v3[j].se);
94 if (x<y)v.push_back(make_pair(x,y));
95 j++;
96 }
97 }
98 ans=1LL*(n%mod)*d[1]%mod*d[2]%mod*d[3]%mod;
99 ans=(ans+1LL*d[1]*d[2]%mod*(n/l[3]*(g[3]%l[3])%mod))%mod;
100 ans=(ans+1LL*d[1]*(n/l[2]*(g[2]%l[2])%mod)%mod*d[3])%mod;
101 ans=(ans+1LL*(n/l[1]*(g[1]%l[1])%mod)*d[2]%mod*d[3])%mod;
102 s=0;
103 for(int i=0;i<v2.size();i++)s=(s+tot(v2[i].fi,v2[i].se))%mod;
104 ans=(ans+1LL*s*d[3])%mod;
105 s=0;
106 for(int i=0;i<v3.size();i++)s=(s+tot(v3[i].fi,v3[i].se))%mod;
107 ans=(ans+1LL*s*d[2])%mod;
108 s=0;
109 for(int i=0;i<v.size();i++)s=(s+v[i].se-v[i].fi)%mod;
110 ans=(ans+1LL*s*d[1])%mod;
111 for(int i=0;i<v.size();i++)ans=(ans+tot(v[i].fi,v[i].se))%mod;
112 ans=1LL*ans*T%mod*qpow(L,mod-2)%mod;
113 printf("%d",ans);
114 }
[atAGC050E]Three Traffic Lights的更多相关文章
- Traffic Lights
Traffic Lights time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- 快速切题 sgu103. Traffic Lights 最短路 难度:1
103. Traffic Lights Time limit per test: 0.25 second(s)Memory limit: 4096 kilobytes input: standardo ...
- sgu 103 Traffic Lights 解题报告及测试数据
103. Traffic Lights Time limit per test: 0.25 second(s) Memory limit: 4096 kilobytes 题解: 1.其实就是求两点间的 ...
- POJ1158 城市交通Traffic lights IOI 1999 (最短路)
POJ1158 城市交通Traffic lights IOI 1999 (最短路) (1) 问题描述(probolem) 在d城里交通的安排不同寻常,城中有路口和路口之间的道路,再任意两个不同的路口之 ...
- sgu 103 Traffic Lights
这道题难得不是算法,而是处理. 题意就是让你求最短路,只有当两个点在某一秒颜色相同时,这条边才可以通行,输入首先给你 起点和终点, 然后给你 点数和边数, 接下来 n 行 初始颜色,初始颜色持续时间, ...
- Traffic Lights - SGU 103(最短路)
题目大意:有一个城市的路线图,有N个交叉点,每两个交叉点之间只有一条路,现在想从交点u去交点v,不过这个路的交通比较特别,每个路都有一个交通灯,灯有两种颜色,蓝色和紫色,例如一条路线在交点s,t之间, ...
- SGU 103.Traffic Lights(最短路)
时间: 0.50 second(s) 空间: 4096 kilobytes 输入: 标准输入 输出: 标准输出 Dingiville 城市的交通规则非常奇怪,城市公路通过路口相连,两个不同路口之间最多 ...
- TRAFFIC LIGHTS POJ 1158
题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...
- 【codeforces 29B】Traffic Lights
[题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...
随机推荐
- MacOS下Java与JDK关系与相关路径
MacOS下Java与JDK关系与相关路径 macOS下的Java与JDK的路径曾经困扰过我一段时间,今天稍有些忘记,故记下笔记,整理一下.Java与JDK的关系不在本文笔记之内,Javaer常识. ...
- 关于web项目中的资源跳转
1.跳转包括两种方式: 转发 forward 重定向 redirect 2.两种方式的代码: AServlet类: //向request范围中存储数据 request.setAttribute(&qu ...
- Windows Terminal 美化教程
Windows Terminal 美化教程 1.安装Windows Terminal 在微软商店搜索Windows Terminal下载即可 2.安装相应的插件 使用管理员权限打开Windows Te ...
- qsort()函数的使用
函数声明 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 参数 ...
- 新一代数据科学ide平台DataSpell提前发行版体验
1 简介 PyCharm开发公司jetbrains专门面向数据科学的ide项目DataSpell在前不久发布了其EAP版本(早期预览版本),为我们带来了诸多趋于成熟的功能特性,本文就将为大家介绍其使用 ...
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...
- 什么是Spring,SpringMVC,SpringBoot,SpringCloud?通俗易懂
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.Spring使你能够编写更干净.更可管理.并且更易于测试的代码. Spring MVC是Spring的一个模块,一个web框 ...
- 395.至少有 K 个重复字符的最长子串
题目 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k .返回这一子串的长度. 示例 1: 输入:s = "aaabb" ...
- UltraSoft - Alpha - Scrum Meeting 2
Date: Apr 09th, 2020. 会议内容为完成初步的任务分工. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 继续Django tuto ...
- 【二食堂】Alpha - Scrum Meeting 3
Scrum Meeting 3 例会时间:4.13 12:00 - 12:30 进度情况 组员 昨日进度 今日任务 李健 1. 继续学习前端知识,寻找一些可用的框架.issue 1. 搭建主页html ...