zoukankan      html  css  js  c++  java
  • 20190722

    今天的题还是很水的,但还是挽救不了我

    T1.方程的解

      除了一堆特判别的好像啥都没有。

      还好前一天自己仔细研究了一下扩欧的板子,起码板子打对了。

      记一下错因吧。

      方程通解为x=cx0/d+kb/d y=cy0/d-ka/d

      我通过求k的范围确定了解的个数,但实际上应该用ymax-ymin求解个数

      

     1 #include <cstdio>
     2 #define re register
     3 #define int long long
     4 using namespace std;
     5 int hp_and_rp;
     6 inline int exgcd(re int a,re int b,re int c,re int &x,re int &y){
     7     if(b==0){
     8         y=0;
     9         x=c/a;
    10         return a;
    11     }
    12     re int g=exgcd(b,a%b,c,y,x);
    13     y-=(a/b)*x;
    14     return g;
    15 }
    16 main(){
    17     scanf("%lld",&hp_and_rp);
    18 while(hp_and_rp--)
    19 {
    20     re int a,b,c,x,y;
    21     re bool flag_a=0,flag_b=0;
    22     scanf("%lld%lld%lld",&a,&b,&c);
    23     if(c<0)a=-a,b=-b,c=-c;
    24     if(a<0)a=-a,flag_a=1;
    25     if(b<0)b=-b,flag_b=1;
    26     re int g=exgcd(a,b,c,x,y);
    27     if(c%g){puts("0");continue;}
    28     if(a*x+b*y!=c){puts("0");continue;}
    29     if(flag_a)a=-a,x=-x;
    30     if(flag_b)b=-b,y=-y;
    31     if(a==0){
    32         if(y<=0){
    33             puts("0");
    34         }else{
    35             puts("ZenMeZheMeDuo");
    36         }
    37         continue;
    38     }
    39     if(b==0){
    40         if(x<=0){
    41             puts("0");
    42         }else{
    43             puts("ZenMeZheMeDuo");
    44         }
    45         continue;
    46     }
    47     if(a*b<0){
    48         puts("ZenMeZheMeDuo");
    49         continue;
    50     }
    51     if(a<0)a=-a,b=-b,c=-c;
    52     a/=g,b/=g,c/=g,x%=b;
    53     while(x<=0)x+=b;
    54     y=(c-a*x)/b;
    55     re int ymin=y%a;
    56     while(ymin<=0)ymin+=a;
    57     re int ans;
    58     if(ymin>y)ans=0;
    59     else ans=(y-ymin)/a+1;
    60     if(ans>65535)puts("ZenMeZheMeDuo");
    61     else printf("%lld
    ",ans);
    62 }
    63 }
    世事一场大梦,人生几度秋凉

    T2.visit

      我才不会说出来我开心地把 树上染色 码完了
      这个题....我打了个矩阵快速幂,空间n4 时间n6

      呵呵。。。。我%^&^&$*

      我也没想拿太多分,只想要个20的部分分,然鹅....呵呵

     

     1 #include <map>
     2 #include <ctime>
     3 #include <cmath>
     4 #include <cstdio>
     5 #include <cstdlib>
     6 #include <cstring>
     7 #include <iostream>
     8 #include <algorithm>
     9 using namespace std;
    10 #define QAQ 444
    11 #define re register
    12 #define ll long long
    13 #define pt pair<int,int>
    14 #define mp(a,b) make_pair(a,b)
    15 #define fup(i,a,b) for(re int i=a;i<=b;++i)
    16 #define fdn(i,a,b) for(re int i=a;i>=b;--i)
    17 inline int random(re int n){
    18     return (ll)rand()*rand()%n;
    19 }
    20 int t,mod,n,tot,m;
    21 map< pt,int >mmp;
    22 inline int read(){
    23     re int x(0),f(1);re char ch=getchar();
    24     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    25     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    26     return x*f;
    27 }
    28 struct huaQ{
    29     int mat[666][666];
    30     inline void clear(){
    31         memset(mat,0,sizeof mat);
    32     }
    33     inline void print(){
    34         fup(i,1,n){
    35             fup(j,1,n)
    36                 printf("%d",mat[i][j]);
    37         puts("");
    38         }
    39         puts("******************");
    40     }
    41 }niknikni;
    42 huaQ operator * (const huaQ &a,const huaQ &b){
    43     huaQ c;c.clear();
    44     fup(i,1,n)fup(j,1,n)fup(k,1,n)
    45     {
    46         c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
    47         c.mat[i][j]%=mod;
    48     }
    49     return c;
    50 }
    51 inline huaQ quick_fk_me(re huaQ a,re int b){
    52     huaQ ans=a;--b;
    53     for(;b;b>>=1){
    54         if(b&1)ans=ans*a;
    55         a=a*a;
    56     }
    57     return ans;
    58 }
    59 int main(){
    60     srand((unsigned)time(0));
    61     re int x,y;
    62     huaQ niknikni;
    63     niknikni.clear();
    64     t=read(),mod=read();
    65     x=read(),y=read();
    66     if(t*t>=666){
    67         printf("%d",random(mod));
    68         return 0;
    69     }
    70     fup(i,-t,t){
    71         fup(j,-t,t){
    72             //printf("%d %d ",i,j);
    73             pt kkk=mp(i,j);
    74             mmp[kkk]=++tot;
    75             //printf("%d
    ",tot);
    76         }
    77     }
    78     n=tot;
    79     fup(i,1,tot){
    80         if(i%(2*t+1))
    81         niknikni.mat[i][i+1]=1;
    82         if(i%(2*t+1)!=1)
    83         niknikni.mat[i][i-1]=1;
    84         if(i-(2*t+1)>=1)
    85         niknikni.mat[i][i-2*t-1]=1;
    86         if(i+(2*t+1)<=tot)
    87         niknikni.mat[i][i+2*t+1]=1;
    88     }
    89     //niknikni.print();
    90     huaQ ans=quick_fk_me(niknikni,t);
    91     //pt fff=mp(2,1);
    92     //printf("%d",mmp[fff]);
    93     pt st=mp(0,0),ed=mp(x,y);
    94     //printf("%d %d
    ",mmp[st],mmp[ed]);
    95     //ans.print();
    96     if(ans.mat[mmp[st]][mmp[ed]]<=0)printf("%d",random(mod));
    97     else printf("%d",ans.mat[mmp[st]][mmp[ed]]);
    98 }
    WODAKOUCHISHI

      正解是组合数。

      这是一道很好的数论拼盘Lucas CRT 逆元 分解质因数....

      改题时选择了数据点分治一直过不去....

      发现不分治直接wa0 我???

      后来发现有一个分支没求阶乘妈耶。

      式子很好推

      我选择了lyl的式子

      C(t,k)*C(t-k,k-m)*C(t-2k+m,(t-2k+m+n)/2)

      式子好理解

       设k为向上走的步数(纯的,不包括向下),那么向下走的步数为k-m

       即C(T,k)×C(T-k,k-m);

       由上式可推出 向右的与向左的步数之和为T-2*k+m,而向右的比向左的多n,利用和差公式,易得,向右的为(T-2*k+m+n)/2;

       且k>=m,(T-2*k+m+n)/2>=n;可得,k->[m,(T+m-n)/2];

       故整体公式为

       ∑(k->[m,(T+m-n)/2])(C(T,k)×C(T-k,k-m)×C(T-2*k+m,(T-2*k+m+n)/2));

       引用lyl)

      枚举k 注意范围 k-m>=0 (t-2k+m+n)/2>=n

      主要还是实现卡了一下午

      对CRT理解不够

      这个题的ans % mod的解

      可以看为一个线性同余方程组

      ans%p1=ans1

      ans%p2=ans2

      ......

      ans%pi=ansi

      pi为分解后的质因数,ansi对于pi取模后的解,用CRT可以合并

      有个ZZ的细节是阶乘、逆元要预处理

      对于每一个pi处理一组阶乘和逆元

      

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 using namespace std;
     6 #define QAQ 100010
     7 #define re register
     8 #define int long long
     9 #define ll long long
    10 #define fup(i,a,b) for(re int i=a;i<=b;++i)
    11 #define fdn(i,a,b) for(re int i=a;i>=b;--i)
    12 int n,m,mod,t;
    13 ll ans;
    14 int fac[QAQ],inv[QAQ];
    15 void exgcd(re ll a,re ll b,re ll &x,re ll &y){
    16     if(b==0){x=1,y=0;return;}
    17     exgcd(b,a%b,x,y);
    18     re int z=x;
    19     x=y,y=z-a/b*y;
    20 }
    21 inline ll crt(){
    22     re ll ans=0,lcm=1,x,y;
    23     fup(i,1,tot)lcm*=p[i];
    24     fup(i,1,tot){
    25         re ll tmp=lcm/p[i];
    26         exgcd(tmp,p[i],x,y);
    27         x=(x%p[i]+p[i])%p[i];
    28         ans=(ans+tmp*x*w[i])%lcm;
    29     }
    30     return (ans+lcm)%lcm;
    31 }
    32 inline void Get_fac_and_inv(re int top,re int pk){
    33     fac[0]=fac[1]=inv[0]=inv[1]=1;
    34     fup(i,2,top)fac[i]=1ll*fac[i-1]*i%pk;
    35     fup(i,2,top)inv[i]=(pk-pk/i)*inv[pk%i]%pk;
    36     fup(i,1,top)inv[i]=1ll*inv[i-1]*inv[i]%pk;
    37 }
    38 int CC(re int n,re int m,re int pk){
    39     if(m>n)return 0;
    40     return fac[n]*inv[m]%pk*inv[n-m]%pk;
    41 }
    42 int lucas(re int n,re int m,re int pk){
    43     if(!m)return 1;
    44     return CC(n%pk,m%pk,pk)*lucas(n/pk,m/pk,pk)%pk;
    45 }
    46 inline bool divide(int n){
    47     re int top=sqrt(n);
    48     fup(i,2,top){
    49         if(n%i)continue;
    50         p[++tot]=i;
    51         while(n%i==0)n/=i;
    52     }
    53     if(n>1)p[++tot]=n;
    54     return tot==1;
    55 }
    56 main(){
    57     scanf("%lld%lld",&t,&mod);
    58     scanf("%lld%lld",&n,&m);
    59     if(n<0)n=-n;
    60     if(m<0)m=-m;
    61     re int st=m,ed=(t+m-n)>>1;
    62     if(divide(mod)){
    63         Get_fac_and_inv(min(t,mod),mod);//什么纱吊错 妈耶 不求阶乘??!!
    64         fup(k,st,ed)
    65         ans=(ans+lucas(t,k,mod)*lucas(t-k,k-m,mod)%mod*lucas(t-2*k+m,(t-2*k+m-n)>>1,mod)%mod)%mod;
    66         printf("%lld
    ",ans);
    67         return 0;
    68     }
    69     fup(i,1,tot){
    70         re int pk=p[i];
    71         Get_fac_and_inv(min(t,pk),pk);
    72         fup(k,st,ed)
    73         w[i]=(w[i]+lucas(t,k,pk)*lucas(t-k,k-m,pk)%pk*lucas(t-2*k+m,(t-2*k+m-n)>>1,pk)%pk)%pk;
    74     }
    75     printf("%lld
    ",crt());
    76 }
    梦里不知身是客,半晌贪欢

    T3.光(大模拟)

      1,每一个格子只会被 左下<->右上 左上<->右下 两种光线的其中一种经过。

      2,光线的路径一定是一个完整的环,而不是环+链。也就是说,它一定还会不止一次的以起始状态经过起始点。

      证明详见DeepinC

      有了这个结论就可以做了

      首先 对于左上、右下,x-y的值不变 即每一个x-y都对应着唯一的一条直线

      同理 左下、右上 x+y的值不变 也对应着一条直线

      所以我们就可以求出每一条直线上的障碍情况 通过二分找到当前位置的前驱或后继 即确定下一步撞到哪

      据题意就可以模拟光的反射了

      当我用map<pair<int,int>,bool>存下所有的障碍坐标时,有人说可以优化暴力,其实时间复杂度是撑不住的

      在正解中你只会撞障碍 过程是不考虑的

      因而有一个小细节 什么时候停止?

      当且仅当回到起点且方向相同时。

      但是不是只撞障碍吗?

      所以你可以单步模拟一次让它相当与从一个障碍处出发 当然这个过程不计入答案

      

      1 #include <set>
      2 #include <map>
      3 #include <cmath>
      4 #include <cstdio>
      5 #include <vector>
      6 #include <iostream>
      7 using namespace std;
      8 #define QAQ 100000
      9 #define re register
     10 #define ll long long
     11 #define pt pair<int,int>
     12 #define mp(a,b) make_pair(a,b)
     13 #define fup(i,a,b) for(re int i=a;i<=b;++i)
     14 int n,m,k,stx,sty,now;
     15 ll ans;
     16 set<int>wtf1[QAQ<<1],wtf2[QAQ<<1];
     17 map<pt,bool>mmp;
     18 inline int read(){
     19     re int x(0),f(1);re char ch=getchar();
     20     while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
     21     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
     22     return x*f;
     23 }
     24 inline int order(char *ch){
     25     if(ch[0]=='N'&&ch[1]=='E')return 1;
     26     if(ch[0]=='N'&&ch[1]=='W')return 2;
     27     if(ch[0]=='S'&&ch[1]=='E')return 3;
     28     if(ch[0]=='S'&&ch[1]=='W')return 4;
     29 }
     30 int main(){
     31     re char op[3];
     32     n=read(),m=read(),k=read();
     33     fup(i,1,k){
     34         re int x,y;
     35         x=read(),y=read();
     36         mmp[mp(x,y)]=1;
     37         wtf1[x+y].insert(x);
     38         wtf2[x-y+QAQ].insert(x);
     39     }
     40     fup(i,0,n+1){
     41         mmp[mp(i,0)]=1;
     42         mmp[mp(i,m+1)]=1;
     43         wtf1[i+0].insert(i);
     44         wtf2[i-0+QAQ].insert(i);
     45         wtf1[i+m+1].insert(i);
     46         wtf2[i-m-1+QAQ].insert(i);
     47     }
     48     fup(i,1,m){
     49         mmp[mp(0,i)]=1;
     50         mmp[mp(n+1,i)]=1;
     51         wtf1[0+i].insert(0);
     52         wtf2[0-i+QAQ].insert(0);
     53         wtf1[n+1+i].insert(n+1);
     54         wtf2[n+1-i+QAQ].insert(n+1);
     55     }
     56     stx=read(),sty=read();scanf("%s",op);
     57     now=order(op);
     58     re int x=stx,y=sty,tox,toy,st,flag=0,ok=0;
     59     switch(now){
     60             case 1 : {
     61                 tox=*--wtf1[x+y].lower_bound(x);
     62                 toy=x+y-tox;
     63                 pt judge=mp(tox+1,toy);
     64                 pt judge2=mp(tox,toy-1);
     65                 bool fu=mmp[judge],ck=mmp[judge2];
     66                 if(fu&&ck)now=4,flag=1;
     67                 else if(fu)now=2,++tox;
     68                 else if(ck)now=3,--toy;
     69                 else now=4,flag=1;
     70                 x=tox,y=toy;
     71                 break;}
     72             case 2 : {
     73                 tox=*--wtf2[x-y+QAQ].lower_bound(x);
     74                 toy=tox-x+y;
     75                 pt judge=mp(tox+1,toy);
     76                 pt judge2=mp(tox,toy+1);
     77                 bool fu=mmp[judge],ck=mmp[judge2];
     78                 if(fu&&ck)now=3,flag=1;
     79                 else if(fu)now=1,++tox;
     80                 else if(ck)now=4,++toy;
     81                 else now=3,flag=1;
     82                 x=tox,y=toy;
     83                 break;}
     84             case 3 : {
     85                 tox=*wtf2[x-y+QAQ].upper_bound(x);
     86                 toy=tox-x+y;
     87                 pt judge=mp(tox-1,toy);
     88                 pt judge2=mp(tox,toy-1);
     89                 bool fu=mmp[judge],ck=mmp[judge2];
     90                 if(fu&&ck){now=2;}
     91                 if(mmp[judge]){now=4,--tox;}
     92                 else if(ck){now=1,--toy;}
     93                 else now=2;
     94                 x=tox,y=toy;
     95                 break;}
     96             case 4 : {
     97                 tox=*wtf1[x+y].upper_bound(x);
     98                 toy=x+y-tox;
     99                 pt judge=mp(tox-1,toy);
    100                 pt judge2=mp(tox,toy+1);
    101                 bool fu=mmp[judge],ck=mmp[judge2];
    102                 if(fu&&ck){now=1;}
    103                 else if(fu){now=3,--tox;}
    104                 else if(ck){now=2,++toy;}
    105                 else now=1;
    106                 x=tox,y=toy;
    107                 break;}
    108         }
    109     stx=x,sty=y,st=now;
    110     while(1){
    111         if(ok)break;
    112             switch(now){
    113                 case 1 : {
    114                     if(x==stx&&y==sty&&ans!=0&&now==st){ok=1;break;}
    115                     tox=*--wtf1[x+y].lower_bound(x);
    116                     toy=x+y-tox;
    117                     ans+=abs(toy-y)-1;
    118                     pt judge=mp(tox+1,toy);
    119                     pt judge2=mp(tox,toy-1);
    120                     bool fu=mmp[judge],ck=mmp[judge2];
    121                     if(fu&&ck)now=4,flag=1;
    122                     else if(fu)now=2,++tox;
    123                     else if(ck)now=3,--toy;
    124                     else now=4,flag=1;
    125                     x=tox,y=toy;
    126                     break;}
    127                 case 2 : {
    128                     if(x==stx&&y==sty&&ans!=0&&now==st){ok=1;break;}
    129                     tox=*--wtf2[x-y+QAQ].lower_bound(x);
    130                     toy=tox-x+y;
    131                     ans+=abs(toy-y)-1;
    132                     pt judge=mp(tox+1,toy);
    133                     pt judge2=mp(tox,toy+1);
    134                     bool fu=mmp[judge],ck=mmp[judge2];
    135                     if(fu&&ck)now=3,flag=1;
    136                     else if(fu)now=1,++tox;
    137                     else if(ck)now=4,++toy;
    138                     else now=3,flag=1;
    139                     x=tox,y=toy;
    140                     break;}
    141                 case 3 : {    
    142                     if(x==stx&&y==sty&&ans!=0&&now==st){ok=1;break;}
    143                     tox=*wtf2[x-y+QAQ].upper_bound(x);
    144                     toy=tox-x+y;
    145                     ans+=abs(toy-y)-1;
    146                     pt judge=mp(tox-1,toy);
    147                     pt judge2=mp(tox,toy-1);
    148                     bool fu=mmp[judge],ck=mmp[judge2];
    149                     if(fu&&ck)now=2,flag=1;
    150                     else if(fu)now=4,--tox;
    151                     else if(ck)now=1,--toy;
    152                     else now=2,flag=1;
    153                     x=tox,y=toy;
    154                     break;}
    155                 case 4 : {
    156                     if(x==stx&&y==sty&&ans!=0&&now==st){ok=1;break;}
    157                     tox=*wtf1[x+y].upper_bound(x);
    158                     toy=x+y-tox;
    159                     ans+=abs(toy-y)-1;
    160                     pt judge=mp(tox-1,toy);
    161                     pt judge2=mp(tox,toy+1);
    162                     bool fu=mmp[judge],ck=mmp[judge2];
    163                     if(fu&&ck)now=1,flag=1;
    164                     else if(fu)now=3,--tox;
    165                     else if(ck)now=2,++toy;
    166                     else now=1,flag=1;
    167                     x=tox,y=toy;
    168                     break;}
    169             }
    170     }
    171     if(flag)ans>>=1;
    172     printf("%lld",ans);
    173 }
    细节很多

          

      

  • 相关阅读:
    Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】
    告别无止境的增删改查--Java代码生成器
    Java线程监听,意外退出线程后自动重启
    【技术贴】解决Program Files文件夹消失
    【技术贴】破解Myeclipse10.7
    【技术贴】解决Mysql ERROR 1045 (28000): Access denied for
    【技术贴】关闭CMD错误提示声音
    【技术贴】解决QQ空间发表文章手机不显示换行
    【技术贴】Eclipse 右键打开当前文件所在文件夹
    有趣的代码注释
  • 原文地址:https://www.cnblogs.com/bilibiliSmily/p/11235542.html
Copyright © 2011-2022 走看看