Chieh's Blog

Because Of Coding

ZOJ Problem Set - 3690 Choosing number

Chieh posted @ 2015年8月25日 17:11 in NO Answer No Speak , 92 阅读
/*
Author:Chieh
Because Of Coding
*/
//dp[i]=dp[i-1]*m-s;s=dp[i-1]-s; 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <set>
#define LL long long
#define INF 1e9
#define EPS 1e-9
using namespace std;
struct matrix
{
   LL e[2][2];
};
matrix Cal(matrix p,matrix q,int len,int MOD)
{
    matrix c;
    for(int i=0; i<len; i++)
    {
        for(int j=0; j<len; j++)
        {
            c.e[i][j]=0;
            for(int k=0; k<len; k++)
            {
                c.e[i][j]=(c.e[i][j]+((p.e[i][k]*q.e[k][j])%MOD))%MOD;
            }
        }
    }
    return c;
}
const int MOD=1000000007;
int n,m,k;
matrix a,s;
void init()
{
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            if(i==j)s.e[i][j]=1;
            else s.e[i][j]=0;
        }
    }
    a.e[0][0]=m;
    a.e[0][1]=1;
    a.e[1][0]=-k;
    a.e[1][1]=-1;
}
void exp_pow(int b)
{
    while(b)
    {
        if(b&1)s=Cal(s,a,2,MOD);
        a=Cal(a,a,2,MOD);
        b>>=1;
    }
}
void play()
{
    exp_pow(n);
    LL ans=s.e[0][0];
    while(ans<0)ans+=MOD;
    printf("%lld\n",ans);

}
int main()
{
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        init();
        play();
    }
    //  cout << "Hello world!" << endl;
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter