UVaLive 7361(矩阵快速幂)

时间:2023-03-09 00:33:58
UVaLive 7361(矩阵快速幂)

题意:矩阵快速幂求斐波那契数列。

分析:

aaarticlea/png;base64,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" alt="" />

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<list>
#define fin freopen("in.txt", "r", stdin)
#define fout freopen("out.txt", "w", stdout)
#define pr(x) cout << #x << " : " << x << " "
#define prln(x) cout << #x << " : " << x << endl
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const double pi = acos(-1.0);
const double EPS = 1e-;
const int dx[] = {, , -, };
const int dy[] = {-, , , };
const ll MOD = 1e9;
const int MAXN = + ;
const int MAXT = + ;
using namespace std;
struct Node
{
ll c[][];
Node()
{
memset(c, , sizeof c);
}
};
Node multi(Node &a, Node &b)
{
Node ans;
for(int i = ; i < ; ++i)
for(int j = ; j < ; ++j)
for(int k = ; k < ; ++k){
ans.c[i][j] += (a.c[i][k] * b.c[k][j]);
ans.c[i][j] %= MOD;
}
return ans;
}
ll q_pow(ll cur)
{
Node a;
a.c[][] = a.c[][] = a.c[][] = ;
Node ans;
ans.c[][] = ans.c[][] = ;
while(cur)
{
if(cur & )
{
ans = multi(ans, a);
}
a = multi(a, a);
cur /= ;
}
return ans.c[][];
}
int main()
{
int P;
scanf("%d", &P);
while(P--)
{
int K;
ll Y;
scanf("%d%lld", &K, &Y);
printf("%d %lld\n", K, q_pow(Y - ));
}
return ;
}