码迷,mamicode.com
首页 > 其他好文 > 详细

太平洋赛题解

时间:2020-05-30 18:21:53      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:假设   har   矩阵快速幂   col   break   color   turn   return   比较   

题解:

  t1:

    代码:

#include <cstdio>
int main(){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    printf("%d",a+b+c);
    return 0;    
}

典型的入门问题a+b problem的一点拓展.


看到fi=a*f_{i-1}+b*f_{i-2}+c*Ci2很容易想到矩阵快速幂:

技术图片

 

 巧妙的避开了/2的问题

当然你无法巧妙的避开搞个逆元也行

实在不行mod*2到时候再除也行.

当然这题的精华不在于推矩阵,而在那个拓展,没人ak我们的比赛,所以说拓展题就不提了(如果比赛后有人ak也可以找我要哦).

代码:

  

#include <cstdio>
#include <cstring> 
const long long mod=19260817;
long long aa,b,c,js1,js2,n;
struct JZ{
    long long a[5][5];
    JZ(int s){
        if(s==0){memset(a,0,sizeof(a));}
        if(s==1){
            memset(a,0,sizeof(a));
            a[0][0]=js2;a[1][0]=js1;a[2][0]=3;a[3][0]=3;a[4][0]=1;
        }
        if(s==2){
            memset(a,0,sizeof(a));
            a[0][0]=aa;a[0][1]=b;a[0][2]=c;a[1][0]=1;a[2][2]=1;a[2][3]=1;a[3][3]=1;a[3][4]=1;a[4][4]=1;
        }
    }
    friend JZ operator * (JZ a,JZ b){
        JZ c(0);
        for(int i=0;i<=4;i++) for(int j=0;j<=4;j++) for(int k=0;k<=4;k++){c.a[i][j]+=b.a[i][k]*a.a[k][j];c.a[i][j]%=mod;}
        return c;
    }
};
void cl(){
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++){
        scanf("%lld%lld%lld%lld%lld%lld",&aa,&b,&c,&js1,&js2,&n);
        aa%=mod;b%=mod;c%=mod;js1%=mod;js2%=mod;n-=2;JZ an(1);JZ s(2);
        while(n){if(n&1) an=an*s;n>>=1;s=s*s;}
        printf("%d\n",an.a[0][0]);
    }
}
int main(){cl();return 0;}

 

  t2:

  首先我们要先看一下这些数字有什么性质(p^0,p^1,p^2...)

  很容易发现他们%(p+1)只能得到1和p,证明:

  p^0%(p+1)=1

       p^1%(p+1)=p

  p^2%(p+1)=(p+1-1)^2%(p+1)=1

  p^(奇数)%(p+1)=(p^2)^n*p^1=p

  p^(偶数)%(p+1)=(p^2)^n=1

  于是我们这样考虑,假设n<=p,等于p的话先手就一定获胜(直接拿p个走人)n<p的话那么只能一个一个p%2=1则先手胜否则后手胜

  如果n>p,如果n%(p+1)的结果为先手赢,于是先手就会先"搞一局",然后无论后手怎么拿,这要他凑一下mod(p+1)为0就行了(mod只有p和1,能配成),于是先手胜

  如果n%(p+1)为后手胜的情况,后手只要配p+1的整数倍最后把先手搞一下就行了

  然后由于n比较大,边读边去mod就行了

  代码:

  

#include <cstdio>
void cl(){
    int t;
    scanf("%d",&t);
    for(int jsjs=1;jsjs<=t;jsjs++){
        long long p,q;
        scanf("%lld%lld",&p,&q);
        p++;
        long long ha=0;
        char ch=getchar();
        for(;;){
            ch=getchar();
            if(ch<0||ch>9) break;
            ha=(ha*10+ch-0)%(long long)p;
        }
        if(ha==p-1||ha%2) printf("lsx\n");
        else printf("gjk\n");
    }
}
int main(){cl();return 0;}

 

太平洋赛题解

标签:假设   har   矩阵快速幂   col   break   color   turn   return   比较   

原文地址:https://www.cnblogs.com/wish-all-ac/p/12994100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!