Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences

来源:互联网 发布:mac spss24 编辑:程序博客网 时间:2024/05/18 21:06

题目链接:Jzzhu and Sequences

题目大意:给你一个递推式,求f(n)%1e+7

题目思路:先要把给的递推式转化一下,然后求余的时候记得+MOD再求余就好了

#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <vector>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const ll maxn = 2;const ll MOD = 1e9+7;#define mod(x) ((x)%MOD)struct mat{    ll m[maxn][maxn];}unit;mat operator *(mat a,mat b){    mat ret;    ll x;    for(ll i = 0;i < maxn;i++){        for(ll j = 0;j < maxn;j++){            x = 0;            for(ll k = 0;k < maxn;k++)                x += mod((ll)a.m[i][k]*b.m[k][j]);            ret.m[i][j] = mod(x);        }    }    return ret;}void init_unit(){    for(ll i = 0;i < maxn;i++)        unit.m[i][i] = 1;    return ;}mat pow_mat(mat a,ll n){    mat ret = unit;    while(n){        if(n&1) ret = ret*a;        a = a*a;        n >>= 1;    }    return ret;}int main(){    ll n,x,y;    init_unit();    while(~scanf("%lld%lld%lld",&x,&y,&n)){        if(n == 1ll) printf("%lld\n",(x+MOD)%MOD);        else if(n == 2ll) printf("%lld\n",(y+MOD)%MOD);        else{            mat a,b;            b.m[0][0] = 1,b.m[0][1] = 1;            b.m[1][0] = -1,b.m[1][1] = 0;            a.m[0][0] = y,a.m[0][1] = x;            b = pow_mat(b,n-2);            a = a*b;            printf("%lld\n",(a.m[0][0]+MOD)%MOD);        }    }    return 0;}
阅读全文
0 0