题目链接: HDU1005 - Number Sequence
思路
类似斐波那契数列的推导式,但是所求 n 太大,所以用了矩阵快速幂(不了解矩阵快速幂的点我 )。
有人做好像是有周期可循的, 但还是矩阵快速幂来的简单暴力。
代码
#include <cstdio>
#include <cstdlib>
using namespace std;
const int mod = 7;
struct martic
{
int data[2][2];
martic operator*(martic & rhs)
{
martic temp;
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
temp.data[i][j] = ( data[i][0]*rhs.data[0][j]
+ data[i][1]*rhs.data[1][j] ) % mod;
}
return temp;
}
};
int solve(int a, int b, int n)
{
if(n < 3) return 1;
n -= 2;
martic re;
re.data[0][0] = 1;
re.data[0][1] = 0;
re.data[1][0] = 0;
re.data[1][1] = 1;
martic base;
base.data[0][0] = a;
base.data[0][1] = 1;
base.data[1][0] = b;
base.data[1][1] = 0;
while(n)
{
if( n&1 ) re = re * base;
base = base * base;
n >>= 1;
}
return (re.data[0][0] + re.data[1][0]) % mod;
}
int main()
{
int a, b, n;
while(scanf("%d%d%d", &a, &b, &n) && a)
{
printf("%d\n", solve(a%mod, b%mod, n));
}
return 0;
}