hdu 4291A Short problem

来源:互联网 发布:uv在淘宝什么意思 编辑:程序博客网 时间:2024/06/08 10:34

这道题用栈来递归,结果爆掉了,然后只能借鉴他人的,完全算是copy了别人的代码,转自某个题解…………

求循环节的话就是找到f0 f1就找到了,这个以前做过,又忘掉了,太水了,自己

#include<iostream>#include<stdio.h>using namespace std;typedef long long LL;const LLMOD = 1000000007LL;int main() {    LL f0 = 0, f1 = 1, temp = -1;    for (LL i = 1;; i++) {        temp = (3 * f1 + f0) % MOD;        f0 = f1;        f1 = temp;        if (f0 == 0 && f1 == 1) {            printf("%I64d\n", i);            break;        }    }    return 0;}//const LL MOD = 1000000007LL;//222222224//const LL MOD = 222222224LL;//183120

循环节找出来,就好了,话说这道题的几个点,我都不会

#include<stdio.h>#include<string.h>#define inta __int64inta a[2][2],b[2][2];inta n;void matr(inta q[2][2],inta p[2][2],int mark){    inta tmp[2][2];    tmp[0][0] = (q[0][0] * p[0][0]%n + q[0][1] * p[1][0]%n)%n;    tmp[0][1] = (q[0][0] * p[0][1]%n + q[0][1] * p[1][1]%n)%n ;    tmp[1][0] = (q[1][0] * p[0][0]%n + q[1][1] * p[1][0]%n)%n;    tmp[1][1] = (q[1][0] * p[0][1]%n + q[1][1] * p[1][1]%n)%n;    if(mark){      a[0][0] = tmp[0][0];      a[0][1] = tmp[0][1];      a[1][0] = tmp[1][0];      a[1][1] = tmp[1][1];    }    else{      b[0][0] = tmp[0][0];      b[0][1] = tmp[0][1];      b[1][0] = tmp[1][0];      b[1][1] = tmp[1][1];    }}int cal(inta k){      a[0][0] = 1;      a[0][1] = 0;      a[1][0] = 0;      a[1][1] = 1;      b[0][0] = 3;      b[0][1] = 1;      b[1][0] = 1;      b[1][1] = 0;      while(k){       if (k & 1) {            matr(a, b, 1);        }         matr(b, b, 0);        k >>= 1;      }    return  a[0][1];}int main() {    inta x;    while(scanf("%I64d",&x)!=EOF&&x!=-1){        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        if(x==0) printf("0\n");        else if(x==1) printf("1\n");        else{            n=183120;            x=cal(x);            n=222222224;            x=cal(x);            n=1000000007;            x=cal(x);            printf("%I64d\n",x);        }    }    return 0;}


原创粉丝点击