#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<queue>
using namespace std;
struct Matrix
{
__int64 m[3][3];
}E,D;
__int64 a,b,n,mod;
void init()
{
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
E.m[i][j]=(i==j);
D.m[1][1]=a;
D.m[1][2]=b;
D.m[2][1]=1;
D.m[2][2]=a;
}
Matrix Multi(Matrix A,Matrix B)
{
Matrix ans;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
{
ans.m[i][j]=0;
for(int k=1;k<=2;k++)
ans.m[i][j]=(ans.m[i][j]+A.m[i][k]*B.m[k][j])%mod;
}
return ans;
}
Matrix Pow(Matrix A,__int64 k)
{
Matrix ans=E;
while(k)
{
if(k&1)
{
k--;
ans=Multi(ans,A);
}
else
{
k/=2;
A=Multi(A,A);
}
}
return ans;
}
int main()
{
while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&mod)!=EOF)
{
init();
Matrix ans=Pow(D,n-1);
Matrix tmp;
tmp.m[1][1]=a;
tmp.m[2][1]=1;
Matrix cnt;
for(int i=1;i<=2;i++)
for(int j=1;j<=1;j++)
{
cnt.m[i][j]=0;
for(int k=1;k<=2;k++)
cnt.m[i][j]=(cnt.m[i][j]+ans.m[i][k]*tmp.m[k][j])%mod;
}
printf("%I64d\n",(cnt.m[1][1]*2)%mod);
}
return 0;
}
HDU4565 So Easy!
最新推荐文章于 2018-10-24 21:33:06 发布