原题链接
题意:显而易见
题解:
可真是数论大综合……
首先由Fuko_Ibuki大佬给出了本题最重要的一个卡点,移个项……
c
n
∗
f
n
=
c
3
n
−
6
∗
f
n
−
1
∗
f
n
−
2
∗
f
n
−
3
c^n*f_n=c^{3n-6}*f_{n-1}*f_{n-2}*f_{n-3}
cn∗fn=c3n−6∗fn−1∗fn−2∗fn−3
没看出来就再移
c
n
∗
f
n
=
c
n
−
1
∗
f
n
−
1
∗
c
n
−
2
∗
f
n
−
2
∗
c
n
−
3
∗
f
n
−
3
c^n*f_n=c^{n-1}*f_{n-1}*c^{n-2}*f_{n-2}*c^{n-3}*f_{n-3}
cn∗fn=cn−1∗fn−1∗cn−2∗fn−2∗cn−3∗fn−3
令
x
n
=
c
n
∗
f
n
x_n=c^n*f_n
xn=cn∗fn则
x
n
=
x
n
−
1
∗
x
n
−
2
∗
x
n
−
3
x_n=x_{n-1}*x_{n-2}*x_{n-3}
xn=xn−1∗xn−2∗xn−3
考虑到任意
x
n
x_n
xn均由
x
1
、
x
2
、
x
3
x_1、x_2、x_3
x1、x2、x3的若干次幂相乘得来
转换一下就把积变成了和
x
n
=
x
1
k
n
−
1
+
k
n
−
2
+
k
n
−
3
∗
x
2
k
n
−
1
+
k
n
−
2
+
k
n
−
3
∗
x
3
k
n
−
1
+
k
n
−
2
+
k
n
−
3
x_n=x_1^{k_{n-1}+k_{n-2}+k_{n-3}}*x_2^{k_{n-1}+k_{n-2}+k_{n-3}}*x_3^{k_{n-1}+k_{n-2}+k_{n-3}}
xn=x1kn−1+kn−2+kn−3∗x2kn−1+kn−2+kn−3∗x3kn−1+kn−2+kn−3
k之类的只是个感性关系
好的那么把这个幂次列个表
100
1 0 0
100
010
0 1 0
010
001
0 0 1
001
111
1 1 1
111
……
显然可以用矩阵快速幂递推
矩阵就是
111
1 1 1
111
100
1 0 0
100
010
0 1 0
010
其中
1
,
1
1,1
1,1是
x
3
x_3
x3的幂次,
1
,
2
1,2
1,2是
x
2
x_2
x2的幂次之类的
接着又遇到一个问题
这个幂次可以大于1e18所以要取模
好在原模数是质数
所以直接欧拉降幂第一条就可以了
x
n
≡
x
(
n
%
p
h
i
(
p
)
)
(
m
o
d
p
)
x^n\equiv x^{(n\%phi(p))} (mod p)
xn≡x(n%phi(p))(modp)
p
h
i
(
1
e
9
+
7
)
=
1
e
9
+
6
phi(1e9+7)=1e9+6
phi(1e9+7)=1e9+6
最后别忘了把
c
n
c^n
cn转换成逆元移过去,解出
f
n
f_n
fn
代码如下:
#include<bits/stdc++.h>
#define mod 1000000006
#define mod1 1000000007
using namespace std;
long long n,f1,f2,f3,c;
struct matrix
{
long long x[4][4];
void init()
{
memset(x,0,sizeof(x));
}
void print()
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
printf("%lld ",x[i][j]);
}
puts("");
}
}
};
inline matrix mul(matrix a,matrix b)
{
matrix c;
c.init();
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
for(int k=1;k<=3;k++)
{
c.x[i][j]=(c.x[i][j]+(a.x[k][j]*b.x[i][k]%mod))%mod;
}
}
}
return c;
}
inline matrix kasumi(long long b)
{
matrix ans,c;
ans.init(),c.init();
ans.x[1][1]=1,ans.x[2][2]=1,ans.x[3][3]=1;
c.x[1][1]=1,c.x[1][2]=1,c.x[1][3]=1,c.x[2][1]=1,c.x[3][2]=1;
while(b)
{
if(b&1) ans=mul(ans,c);
c=mul(c,c);
b>>=1;
}
return ans;
}
inline long long kasumi1(long long a,long long b)
{
long long ans=1ll;
while(b)
{
if(b&1) ans=ans*a%mod1;
a=a*a%mod1;
b>>=1;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld%lld%lld",&n,&f1,&f2,&f3,&c);
f1=f1*c%mod1,f2=f2*c%mod1*c%mod1,f3=f3*c%mod1*c%mod1*c%mod1;
matrix tmp=kasumi(n-3);
long long ans1=kasumi1(f1,tmp.x[1][3])%mod1*kasumi1(f2,tmp.x[1][2])%mod1*kasumi1(f3,tmp.x[1][1])%mod1;
long long cv=kasumi1(c,mod1-2);
long long cc=kasumi1(cv,n);
printf("%lld\n",ans1*cc%mod1);
}