为什么矩阵倒一下就AC了? 最开始写的:
#include<stdio.h>
#define ll long long
inline ll read()
{
register ll ret = 0, f = 1;
register char ch = getchar();
while (ch < '0' || ch > '9')
(ch == '-') ? f = -1 : 0, ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return ret * f;
}
ll mod;
struct mat
{
ll a[9][9];
inline mat()
{
for (register int i = 0;i < 5;++ i)
for (register int j = 0;j < 5;++ j)
a[i][j] = 0;
}
inline mat operator * (const mat& x)
{
mat ret;
for (register int i = 1;i < 3;++ i)
for (register int j = 1;j < 3;++ j)
for (register int k = 1;k < 3;++ k)
ret.a[i][j] = (ret.a[i][j] + a[i][k] * x.a[k][j] % mod) % mod;
return ret;
}
};
int main()
{
register int p = read(), q = read(), a1 = read(), a2 = read(), n = read();
mod = read();
mat ans, a;
ans.a[1][1] = a2, ans.a[2][1] = a1;
a.a[1][1] = p, a.a[1][2] = q, a.a[2][1] = 1;
if (n == 2)
printf("%d", a2);
else if (n == 1)
printf("%d", a1);
else
{
n -= 2;
while (n)
{
if (n & 1)
ans = ans * a;
a = a * a;
n >>= 1;
}
printf("%lld", ans.a[1][1]);
}
return 0;
}
后来改对的:
#include<stdio.h>
#define ll long long
inline ll read()
{
register ll ret = 0, f = 1;
register char ch = getchar();
while (ch < '0' || ch > '9')
(ch == '-') ? f = -1 : 0, ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return ret * f;
}
ll mod;
struct mat
{
ll a[9][9];
inline mat()
{
for (register int i = 0;i < 5;++ i)
for (register int j = 0;j < 5;++ j)
a[i][j] = 0;
}
inline mat operator * (const mat& x)
{
mat ret;
for (register int i = 1;i < 3;++ i)
for (register int j = 1;j < 3;++ j)
for (register int k = 1;k < 3;++ k)
ret.a[i][j] = (ret.a[i][j] + a[i][k] * x.a[k][j] % mod) % mod;
return ret;
}
};
int main()
{
register int p = read(), q = read(), a1 = read(), a2 = read(), n = read();
mod = read();
mat ans, a;
ans.a[1][1] = a2, ans.a[1][2] = a1;
a.a[1][1] = p, a.a[2][1] = q, a.a[1][2] = 1;
if (n == 2)
printf("%lld", a2);
else if (n == 1)
printf("%lld", a1);
else
{
n -= 2;
while (n)
{
if (n & 1)
ans = ans * a;
a = a * a;
n >>= 1;
}
printf("%lld", ans.a[1][1]);
}
return 0;
}