首页 > 代码库 > uva 12169

uva 12169

 1  /* 巨大的斐波那契数列_________________________________________________________________________________
 2                                     
 3                                       #include <iostream> 
 4                                       #include <map> 
 5                                       #include <cmath>
 6                                       #include <vector>
 7                                       #include <cstdio>
 8                                       #include <string>
 9                                       #include <cstring> 
10                                       #include <algorithm>    
11                                       using namespace std; 
12                                       #define fir first
13                                       #define sec second
14                                       #define pb(x) push_back(x) 
15                                       #define mem(A, X) memset(A, X, sizeof A)
16                                       #define REP(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
17                                       #define rep(i,l,u) for(int (i)=(int)(l);(i)>=(int)(u);--(i)) 
18                                       #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) 
19                                           
20                                       typedef pair<long,long>  pll;     
21                                       
22                                       
23                                       int T,n;
24                                       const int mod=1e9+7; 
25                                       const int maxn=1e3+10; 
26                                        typedef unsigned  long long ULL;  
27                                        ULL qsm(ULL a, ULL b, ULL mod)  // 0<=a<=ULL  0<=b<=ULL   
28                                       {   
29                                           a=a%mod;
30                                           ULL res=1;  
31                                           while(b)  
32                                           {  
33                                               //a=a%mod;(有时候n的值太大了会超出long long的储存,所以要先取余)  
34                                               if(b&1)//&位运算:判断二进制最后一位是0还是1,&的运算规则为前后都是1的时候才是1;  
35                                                   res=res*a%mod;  
36                                               b=b>>1;//相当于除以2;  
37                                               a=a*a%mod;  
38                                           }  
39                                           return res;  
40                                       }        
41                                       ULL f[maxn*maxn+1000];
42                                       int main()
43                                       {
44                                            freopen("in.txt","r",stdin); 
45                                            //while(cin>>n)
46                                            while(cin>>T&&T)
47                                            { 
48                                              REP(kase,1,T)  {
49                                                  ULL ans;
50                                                  ULL a,b,n;
51                                                  cin>>a>>b>>n;
52                                                  if(a==0||n==1) ans=0;
53                                                  else
54                                                  {
55 
56                                                  f[1]=1;
57                                                  f[0]=0; 
58                                                  int M;
59                                                  REP(i,2,n*n+10)
60                                                  {
61                                                      f[i]=(f[i-1]+f[i-2])%n;
62                                                      if(f[i]==f[1]&&f[i-1]==f[0])
63                                                      {
64                                                          M=i-1;
65                                                          break;
66                                                      }
67                                                  } 
68                                                  ULL t=qsm(a,b,M);
69                                                  ans=f[t];
70                                              }
71                                                  cout<<ans<<endl;
72                                               }  
73                                            }
74                                         return 0;
75                                       }
76                           
77                                      /*
78                                         note    :  typedef   给数据类型加个名字, 是一条语句,只需要放在宏定义之后即可(即可全局,可main 函数内).
79                                                     对于循环节类的问题,只需要找到刚开始的起始项,之后找到周期,利用周期的一致性,将查询到
80                                                     项直接进行周期M取模即可,注意f[0]是否进行了赋值,如果没有的话还需要f[0]=f[M].
81                                         debug   :   范围比较大需要用到ull
82                                                     re的原因有可能是因为数据类型不一致,(返回 runtime error )
83                                                      for(int i=1;i<=(unsigned long long)100;i++)
84                                                     
85                                         optimize:   分析出n的范围,预处理出来,可以避免大量的查询.分析出来了所有的基本可能情况.
86                                                     改进快速幂取模, 
87                                                     命名 进行程序变量的命名的时候,最好直接指代原来的变量例如 预处理n的时候,直接就是n就可以.
88                                                       REP(n,2,maxn)
89                                       */   

 

uva 12169