hdu4291-A Short problem(2012 chengdu online )

如果直接利用n做三次矩阵快速幂对1000000007取模求解的话会超精度,所以必须本地处理寻找每层的循环节,最外层对1000000007取模,则找到最外层的循环节是222222224,次外层对222222224取模,找到次外层循环节是183120。接下来利用这三个不同的mod进行三层快速幂。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
using namespace std;
const long long mod=1000000007;//每次改就好
int main()
{
    long long t0=0, t1=1;
    for(long long  i=1; ; i++)
    {
        t0=(3*t1+t0)%mod;
        swap(t0,t1);
        if(t0==0&&t1==1)
        {
            cout << i <<endl;
            break;
        }
    }
}


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<queue>
#include <deque>
#include <list>
#include <ctime>
#include <stack>
#include <vector>
#include<set>
#define Maxn
typedef long long ll;
#define FOR(i,j,n) for(int i=j;i<=n;i++)
#define DFR(i,j,k) for(int i=j;i>=k;--i)
#define lowbit(a) a&-a
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define MOD   1000000007 //222222224  183120
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
using namespace std;
struct Mat {    ll mat[2][2];};
Mat MatrixMult (Mat a, Mat b,int mod)
{
       Mat c;
    for(int i=0; i<2; i++)
         for(int j=0; j<2; j++)
         {
             c.mat[i][j]=0;
             for(int k=0; k<2; k++)
            { c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%mod;
             c.mat[i][j]%=mod;


            }
         }
     return c;
}
Mat Matrix (Mat a, ll n,ll mod)
 {
    if(n==1)return a;
    Mat ret=a;
    Mat temp=a;
    for(int i=0;i<2;i++)
      for(int j=0;j<2;j++)
      {
          if(i==j)ret.mat[i][j]=1;
          else ret.mat[i][j]=0;
      }
    while(n)
    {
        if(n&1)ret=MatrixMult(ret,temp,mod);
        temp=MatrixMult(temp,temp,mod);
        n>>=1;
    }
    return ret;
}
int main()
{   ll n;
    Mat A,B;
    A.mat[0][0]=3;
    A.mat[0][1]=1;
    A.mat[1][0]=1;
    A.mat[1][1]=0;

    while(~scanf("%I64d",&n))
    {   B=Matrix(A,n,183120);
        B=Matrix(A,B.mat[1][0],222222224);
        B=Matrix(A,B.mat[1][0],MOD);
        printf("%I64d\n",B.mat[1][0]);
    }
    return 0;
}







你可能感兴趣的:(hdu4291-A Short problem(2012 chengdu online ))