[atAGC050E]Three Traffic Lights

原题意可能略微有一些复杂,这里给出简述的题意——

给定$g_{i}$和$r_{i}$(其中$1le ile 3$),求有多少个整数$t$满足:

$0le t< prod_{i=1}^{3}(g_{i}+r_{i})$且$forall 1le ile 3,t mod (g_{i}+r_{i})<g_{i}$,答案对998244353取模

$1le g_{i},t_{i}le 10^{12}$

先来叙述一些关于同余的性质——

性质1:$xequiv y(mod n)$,可推出$xequiv y(mod d)$(其中$d$为$n$的任意约数)

性质2:关于$t$的同余方程$forall 1le ile k,tequiv x_{i}(mod m_{i})$,若其有解$t_{0}$,则$t$为其解当且仅当$tequiv t_{0}(mod M)$,其中$M=lcm(m_{1},m_{2},...,m_{k})$

证明:

充分性——根据性质1,$tequiv t_{0}(mod M)$即可推出$tequiv t_{0}equiv x_{i}(mod m_{i})$

必要性——$t$为解即有$tequiv 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 1le ile 3,tequiv x_{i}(mod m_{i})$

另外定义$n$中$p$的指数为$ord_{p}(n)$,即$max_{age 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$满足$pmid m_{1}$且$p otmid 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})}$)

证明:

原六元组若合法,根据$Pmid m_{1},m_{2}$即有$tequiv 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 1le ile 3,0le x_{i}<g_{i}且(l_{1},x_{1},l_{2},x_{2},l_{3},x_{3})合法,t为其一组解}sum_{0le j<T,jequiv t(mod L)}1
$$
注意到在$[0,T)$中,恰好存在$frac{T}{L}$个模$L$的完系,因此即
$$
sum_{forall 1le ile 3,0le 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_{0le k<g_{j},kequiv i(mod l_{j})}frac{T}{L}=frac{T}{L}sum_{i=0}^{gabc-1}prod_{j=1}^{3}(lfloorfrac{g_{j}}{l_{j}} floor+[i mod l_{j}<g_{j} mod l_{j}])
$$
(注意$L e gabc$,所以这里所发生的变化并没有那么简单)

将后面这3个括号拆开,总共是8项,其中$lfloorfrac{g_{j}}{l_{j}} floor$为常数项,比较容易处理,这里直接考虑三项都是后面的非常数项的情况(一项或两项都类似)

此时,我们换一个角度去看待此问题:令$S_{j}={imid i mod l_{j}<g_{j} mod l_{j}}$,即求$|S_{1}cap S_{2}cap S_{3}|$

关于$S_{j}$,也即$igcup_{0le i<gabc,imid l_{j}}[i,i+g_{j} mod l_{j})$,也就是$frac{gabc}{l_{j}}$个区间,不妨假设$ale ble c$,由于$l_{i}le max$,也即有$a,ble 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 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/14611291.html