UVa 11582 - Colossal Fibonacci Numbers!(取模+周期)

计算第 a b 个斐波那契数对 n 取模的值。对不同的 n 取模,最长 n 2 就会出现循环。首先预处理计算所有可能的值,然后对每个输入快速幂取模找在周期中的位置输出。数据大必须用unsigned long long。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<cstdio>
#include<vector>
using namespace std;
typedef unsigned long long LLU;
const int maxn=1010;
vector<int> f[maxn];
void init(){
for(int i=2;i<maxn;++i){
f[i].push_back(0);
f[i].push_back(1%i);
for(int j=2;;++j){
f[i].push_back((f[i][j-1]+f[i][j-2])%i);
if(f[i][j-1]==0&&f[i][j]==1) break;
}
f[i].pop_back(),f[i].pop_back();
}
return;
}
LLU modexp(LLU a,LLU b,LLU mod){
LLU cur=1,tmp=a;
while(b){
if(b&1) cur=cur*tmp%mod;
tmp=tmp*tmp%mod;
b>>=1;
}
return cur;

}
int main(){
init();
int t;scanf("%d",&t);
while(t--){
LLU a,b,n;
scanf("%llu%llu%llu",&a,&b,&n);
LLU k=LLU(f[n].size());
printf("%d\n",k?f[n][modexp(a%k,b,k)]:0);
}
return 0;
}

** 本文迁移自我的CSDN博客,格式可能有所偏差。 **