标签:假设 har 矩阵快速幂 col break color turn return 比较
代码:
#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;}
首先我们要先看一下这些数字有什么性质(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