题目链接:https://ac.nowcoder.com/acm/contest/903/B
思路:POJ - 3233 - Matrix Power Series这一题的弱化版,直接上代码。
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 2;
ll n, k, MOD;
struct Matrix
{
ll m[5][5];
void init(int x)
{
memset(m, 0, sizeof(m));
for(int i = 0; i < MAXN; i++){
m[i][i] = x;
}
}
Matrix operator * (const Matrix &a) const
{
Matrix res;
res.init(0);
for(int i = 0; i < MAXN; i++)
for(int j = 0; j < MAXN; j++)
for(int k = 0; k < MAXN; k++)
res.m[i][j] = (res.m[i][j] + (m[i][k] * a.m[k][j]) % MOD) % MOD;
return res;
}
Matrix operator + (const Matrix &a) const
{
Matrix ans;
ans.init(0);
for(int i = 0; i < MAXN; i++)
for(int j = 0; j < MAXN; j++)
ans.m[i][j] = (ans.m[i][j] + (m[i][j] + a.m[i][j]) % MOD) % MOD;
return ans;
}
};
Matrix quickPow(Matrix x, ll p)
{
Matrix res;
res.init(1);
x = x * res;
while(p)
{
if(p & 1) res = res * x;
p >>= 1;
x = x * x;
}
return res;
}
Matrix a, x;
void init()
{
a.m[0][0] = n;
a.m[0][1] = 1;
a.m[1][1] = 1;
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld", &n, &k, &MOD);
init();
a = quickPow(a, k + 1);
printf("%lld\n", a.m[0][1] % MOD - 1);
}
return 0;
}