//目录

Uva 11582 巨大的斐波那契数 模运算

题目链接:https://vjudge.net/contest/156903#problem/A

题意:计算 f(a^b)%n

分析:

1、斐波那契数列是 f(i+2) = f(i+1) + f(i)

2、询问次数是10^4,打表处理;设 f(n,i) 是 f(i) %n 的余数;

3、根据模运算可以知道:f(n,i) = ( f(n,i-1) + f(n,i-2) ) % n;

4、 a^b的处理了,a,b<2^64,数据很大,但是可以发现一个特征,n很小;取值范围很小;可以看其周期性;

5、a^b 对 %n 的周期,的快速幂取模了;

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 1000 + 5;
 6 typedef unsigned long long ULL;
 7 
 8 int pow_mod(ULL a,ULL b,int n) {
 9     if(b==0) return 1;
10     int k = pow_mod(a,b/2,n);
11     k = k*k%n;
12     if(b%2) k = k*a%n;
13     return k;
14 }
15 
16 int f[maxn][maxn*6],period[maxn];
17 
18 int solve(ULL a,ULL b,int n) {
19     if(a==0||n==1) return 0;
20     int p = pow_mod(a%period[n],b,period[n]);
21     return f[n][p];
22 }
23 
24 int main()
25 {
26     //f(n,i) %n 时 i 的余数
27     for(int n=2;n<=1000;n++) {
28         f[n][0] =0; f[n][1] = 1;
29         for(int i=2;;i++) {
30             f[n][i] = (f[n][i-1]+f[n][i-2]) % n;
31             if(f[n][i-1]==0&&f[n][i]==1)
32             {
33                 period[n] = i-1;
34                 break;
35             }
36         }
37     }
38 
39     ULL a,b;
40     int n,t;
41     scanf("%d",&t);
42     while(t--) {
43         cin>>a>>b>>n;
44         cout<<solve(a,b,n)<<endl;
45     }
46 
47 
48 
49     return 0;
50 }
View Code

 

posted @ 2017-04-02 16:54  小草的大树梦  阅读(289)  评论(0编辑  收藏  举报