zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    设计一个安全邮件传输系统
    2014(2)系统规划,可行性分析,成本效益分析
    2014(1)需求工程,需求获取
    公务员的福利政策
    2015(5)系统设计
    程序猿媛 九:Adroid zxing 二维码3.1集成(源码无删减)
    Android API
    [Android]利用run-as命令在不root情况下读取data下面的数据
    Android实用代码七段(五)
    Android实用代码七段(四)
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14611291.html
Copyright © 2011-2022 走看看