[ustctraining][13.05.09]E - 特殊的数

E - 特殊的数
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Submit Status

Description

一个由n位数字组成的数,它的每一位数字都是奇数,这样的n位数有多少个?

为了增加难度,Jason要求数字7和9只能出现偶数次。

Input

输入数据的第一行一个数T,表示输入数据的组数。

每组数据只有一个数n,表示一个数由n位数组成。

约定:

1≤T≤10000

1≤n≤10^18

Output

对于每组给定的输入,输出一行仅含一个数,满足以上条件的n位数的个数,由于答案可能很大,对1,000,000,007取模。

Sample Input

1
2

Sample Output

11

 

 
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define MST(a,b) memset(a,b,sizeof(a))
#define MOD 1000000007
int main()
{
    freopen("in.txt","r",stdin);
    int nn;
    scanf("%d",&nn);
    FOR(ii,1,nn)
    {
        long long n;
        cin>>n;
        long long a0[3][3];
        MST(a0,0);
        FOR(i,0,2)a0[i][i]=3;
        a0[0][1]=1;
        a0[1][0]=2;
        a0[2][1]=1;
        a0[1][2]=2;
        long long c[3][3],b[3][3];
        MST(c,0);
        FOR(i,0,2)c[i][i]=1;
        FOR(i,0,2)FOR(j,0,2)b[i][j]=a0[i][j];
        long long p=1;
        while(n)
        {
            if(1&n)
            {
                long long c0[3][3];
                FOR(i,0,2)FOR(j,0,2)c0[i][j]=c[i][j];
                MST(c,0);
                FOR(k,0,2)FOR(i,0,2)FOR(j,0,2)c[i][j]=(c[i][j]+c0[i][k]*b[k][j])%MOD;
            }
            n=n>>1;
            long long b0[3][3];
            FOR(i,0,2)FOR(j,0,2)b0[i][j]=b[i][j];
            MST(b,0);
            FOR(k,0,2)FOR(i,0,2)FOR(j,0,2)b[i][j]=(b[i][j]+b0[i][k]*b0[k][j])%MOD;
        }
        long long f0[3],f[3];
        MST(f0,0);
        MST(f,0);
        f0[0]=1;
        FOR(k,0,2)FOR(j,0,2)f[j]=(f[j]+f0[k]*c[k][j])%MOD;
        printf("%d\n",f[0]);
    }

}

 

posted @ 2013-05-09 22:21  ustc-acm  阅读(297)  评论(0编辑  收藏  举报