zoukankan      html  css  js  c++  java
  • [20200723NOIP提高组模拟T1]同余

    题目大意:

      对于四个非负整数$n,c,p,m$以及长度为n的数组${a_{i}}$请求出方程$sum_{i=1}^{n} prod_{j=1}^{a_{i}}x_{i,j} equiv c (mod p)$在$x_{i,j}in [0,p)$中整数解的个数mod $m$后的值.

    solution:

      本题极其恶心,只给了$16MB$的空间,于是乎,看完题解后,我们推起了式子.

      首先我们来分析一下$prod_{i=1}^{n}x_{i} equiv c(mod p)$的解的个数.分情况讨论:

      一、$c eq 0$时,由于$xin [0,p)$,该范围内没有p的倍数,所以对任意的$i$有$x_{i} eq 0$,根据分步乘法原理,我们可以得$prod_{i=1}^{n} x_{i} otequiv c(mod p)$的解个数为$ (p-1)^{n} $,根据平均分配原则,可以得出$ c eq 0 $时,$ prod_{i=1}^{n}x_{i} equiv c(mod p) $的解的个数为$a_{1}=(p-1)^{n-1}$.

      二、$c=0$时,我们可以利用正难则反原理,所有组合的个数为$p^{n}$,$prod_{i=1}^{n} x_{i} otequiv c(mod p)$的解的个数为$(p-1)^{n}$,所以$prod_{i=1}^{n} x_{i} equiv 0(mod p)$的解个数为$b_{1}=p^{n}-(p-1)^{n}$.

      我们分析完了$n=1$的情况,接下来分析$n>1$时状态的转移.

      一、$c=0$时,$prod_{i=1}^{n_{1}}x1_{i}+prod_{j=1}^{n_{2}}x2_{j} equiv 0(mod p)$成立时,有以下情况:

    (1)$prod_{i=1}^{n_{1}} x1_{i} equiv 0(mod p)$且$prod_{j=1}^{n_{2}} x2_{j} equiv 0(mod p)$,此时据乘法原理将$b_{1} cdot b_{2}$计入答案$b_{3}$;

    (2)$prod_{i=1}^{n_{1}} x1_{i} equiv c_{1}(mod p)$,$prod_{i=1}^{n_{2}} x2_{i} equiv c_{2}(mod p)$且$c_{1}+c_{2}==p$,共有$p-1$种情况使$c_{1}+c_{2}==p$,根据乘法原理和加法原理,我们将$(p-1)cdot a_{1} cdot a_{2}$计入答案.

      由此可得,$b_{3}=b_{1}cdot b_{2} + (p-1) cdot a_{1} cdot a_{2}$

      二、$c eq 0$时,$prod_{i=1}^{n_{1}}x1_{i}+prod_{j=1}^{n_{2}}x2_{j} equiv c(mod p)$成立,有以下情况:

    (1)$prod_{i=1}^{n_{1}}x1_{i} equiv 0(mod p)$,那需满足$prod_{j=1}^{n_{2}}x2_{j} equiv c(mod p)$,所以将$b_{1}cdot a_{2}$计入答案$a_{3}$;

    (2)$prod_{j=1}^{n_{2}}x2_{j} equiv 0(mod p)$,仿照上例显然,将$b_{2} cdot a_{1}$计入答案$a_{3}$;

    (3)$prod_{i=1}^{n_{1}}x1_{i} equiv c_{1}(mod p)$,$prod_{j=1}^{n_{2}}x2_{j} equiv c_{2}(mod p)$ $(c_{1} eq 0,c_{2} eq 0)$,欲满足条件,当且仅当$c_{1}+c_{2} equiv c$,经过我们手玩发现,共有$p-2$种,所以根据分布乘法原理,将$(p-2) cdot a_{1} cdot a_{2}$计入答案$a_{3}$;

      由上可知,$a_{3}=b_{1} cdot a_{2} + b_{2} cdot a_{1} + (p-2) cdot a_{1} cdot a_{2}$.

    此后,我们只需根据此二式一一递推下去即可.

                  记得取模防爆. 

    code:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    #define R register
    #define next exnttttttttt
    #define debug puts("mlg")
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef unsigned long long ull;
    inline ll read();
    inline void write(ll x);
    inline void writesp(ll x);
    inline void writeln(ll x);
    inline ll quick_pow(ll _,ll __,ll ___){ll ____=1;for(;__;__>>=1){if(__&1) ____*=_,____%=___;_*=_;_%=___;}return ____;}
    ll T;
    ll n,c,p,m;
    ll a;
    ll a1,a2,ansA,ansB,b1,b2;
    inline ll Mod(ll _){return (_%m+m)%m;}
    inline void mod(ll &_){_=Mod(_);return;}
    int main(){
        freopen("congruence.in","r",stdin);
        freopen("congruence.out","w",stdout);    
        T=read();
        while(T--){
            n=read();c=read();p=read();m=read();
            a=read();
            ansA=a2=a1=Mod(quick_pow(p-1,a-1,m));
            ansB=b2=b1=Mod(quick_pow(p,a,m)-quick_pow(p-1,a,m));
            --n;
            for(R ll i=1;i<=n;i++){
                a=read();
                a1=Mod(quick_pow(p-1,a-1,m));
                b1=Mod(quick_pow(p,a,m)-quick_pow(p-1,a,m));
                a2=ansA;b2=ansB;
                ansA=Mod(Mod(b1*a2)+Mod(b2*a1)+Mod(Mod((p-2)*a1)*a2));
                ansB=Mod(Mod(b1*b2)+Mod(Mod((p-1)*a1)*a2));
            }
            if(c==0) writeln(ansB);
            else writeln(ansA);
        }
    }
    inline ll read(){ll x=0,t=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*t;}
    inline void write(ll x){if(x<0){putchar('-');x=-x;}if(x<=9){putchar(x+'0');return;}write(x/10);putchar(x%10+'0');}
    inline void writesp(ll x){write(x);putchar(' ');}
    inline void writeln(ll x){write(x);putchar('
    ');}
                                      己亥岁·僖宗广明元年(其一)
                                              唐 曹松
                                  泽国江山入战图,生民何计乐樵苏。
                                  凭君莫话封侯事,一将功成万骨枯。

     

  • 相关阅读:
    ABAP Webdynpro Interface View的用法
    ABAP Webdynpro的跟踪工具WD_TRACE_TOOL
    git 速查
    Python 解析含有命名空间(xmlns)的xml文件(基于ElementTree)
    完全显示DataFrame中行、列内容
    解决Jupyter Notebook中for循环输出DataFrame不够美观
    git配置别名
    元素可拖拽(移动端与pc端)
    pointer network和recursive神经网络
    ELMO,BERT和GPT简介
  • 原文地址:https://www.cnblogs.com/ylwtsq/p/13368288.html
Copyright © 2011-2022 走看看