1021

贴个模板

#include <cstdio>
#include <cstring>
using namespace std;

int mat[2][2];
int fmat[32][2][2];
int tmp[2][2];
int e[2][2]={1,0,0,1};
int r[2][2];

void pre(){
memcpy(fmat,e,sizeof(e));
memcpy(fmat[1],mat,sizeof(mat));


for(int i=2; i<32; ++i){
   for(int j=0; j<2; ++j){
       for(int k=0; k<2; ++k){
           int tt=0;
           for(int l=0; l<2; ++l){
           tt+=fmat[i-1][j][l]*fmat[i-1][l][k]; tt%=3;
}
           tmp[j][k]=tt;
}
}
           memcpy(fmat[i],tmp,sizeof(tmp));
}
}

int main(){
int a=1,b=1,n; //a b 可以自己设。
while(~scanf("%d",&n)){

memcpy(r,e,sizeof(e));
n-=1;
mat[0][1]=1;
mat[1][0]=b;
mat[1][1]=a;
pre();
int cnt=1<<30;
int id=31;
if(n==-1||n==0){
printf("no/n");
fflush(stdout);
}
else{
while(n>0){
if(n>=cnt){
n-=cnt;
for(int i=0; i<2; ++i)
for(int j=0; j<2; ++j){
    int temp=0;
   for(int k=0; k<2; ++k)
     temp+=r[i][k]*fmat[id][k][j];
     temp%=3;
   tmp[i][j]=temp;
}
memcpy(r,tmp,sizeof(tmp));
}
--id;
cnt>>=1;
}
//printf("%d/n",(tmp[1][0]+tmp[1][1])%7);
if((tmp[1][0]*7+tmp[1][1]*11)%3==0)
    printf("yes/n");
else
    printf("no/n");
fflush(stdout);
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值