您的位置:首页 > 其它

UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!

2014-12-08 13:50 399 查看
题意:

斐波那契数列f(0) = 0, f(1) = 1, f(n+2) = f(n+1) + f(n) (n ≥ 0)

输入a、b、n,求f(ab)%n

分析:

构造一个新数列F(i) = f(i) % n,则所求为F(ab)

如果新数列中相邻两项重复出现的话,则根据递推关系这个数列是循环的。

相邻两项所有可能组合最多就n2中,所以根据抽屉原理得到这个数列一定是循环的。

求出数列的周期,然后快速幂取模即可。

#include <cstdio>
#include <iostream>
using namespace std;

const int maxn = 1000 + 10;
typedef unsigned long long ULL;
int f[maxn][maxn * 6], period[maxn];

int pow_mod(ULL a, ULL b, int n)
{
if(b == 0) return 1;
int k = pow_mod(a, b/2, n);
k = k * k % n;
if(b % 2 == 1) k = k * a % n;
return k;
}

int solve(ULL a, ULL b, int n)
{
if(a == 0 || n == 1) return 0;
int p = pow_mod(a % period
, b, period
);
return f
[p];
}

int main(void)
{
freopen("11582in.txt", "r", stdin);
for(int n = 2; n < maxn; ++n)
{
f
[0] = 0, f
[1] = 1;
for(int i = 2; ; ++i)
{
f
[i] = (f
[i-2] + f
[i-1]) % n;
if(f
[i-1] == 0 && f
[i] == 1)
{
period
= i - 1;
break;
}
}
}

ULL a, b;
int n, T;
scanf("%d", &T);
while(T--)
{
cin >> a >> b >> n;
printf("%d\n", solve(a, b, n));
}

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: