您的位置:首页 > 其它

hdu 4565 So Easy!

2014-05-02 10:07 302 查看
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4565

可以参考hdu2256解法类似:/article/10999491.html

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

typedef long long LL;

struct Matrix
{
LL iMatrix[2][2];
};

Matrix iPer, iCell;
LL a, b, n, iMod;

void Inite_Matrix()
{
iPer.iMatrix[0][0] = iPer.iMatrix[1][1] = 1, iPer.iMatrix[0][1] = iPer.iMatrix[1][0] = 0;
iCell.iMatrix[0][0] = iCell.iMatrix[1][1] = a, iCell.iMatrix[0][1] = b, iCell.iMatrix[1][0] = 1;
}

Matrix Multi_Matrix(Matrix a, Matrix b)
{
Matrix c;
int i, j, k;
for(i = 0; i < 2; ++i)
{
for(j = 0; j < 2; ++j)
{
c.iMatrix[i][j] = 0;
for(k = 0; k < 2; ++k)
{
c.iMatrix[i][j] = (c.iMatrix[i][j]%iMod + ((a.iMatrix[i][k]%iMod) * (b.iMatrix[k][j]%iMod))%iMod)%iMod;
}
}
}
return c;
}

Matrix Quick_Mod_Matrix(LL n)
{
if(n == 1)
return iCell;
Matrix c, tmp;
tmp = iCell;
c = iPer;
while(n)
{
if(n&1)
{
c = Multi_Matrix(c, tmp);
n--;
}
n >>= 1;
tmp = Multi_Matrix(tmp, tmp);
}
return c;
}

int main()
{
Matrix c;
while(~scanf("%lld %lld %lld %lld", &a, &b, &n, &iMod))
{
Inite_Matrix();
c = Quick_Mod_Matrix(n);
printf("%lld\n", (2*(c.iMatrix[0][0]%iMod)%iMod));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: