2018年东北农业大学春季校赛 wyh的数列

链接:https://www.nowcoder.com/acm/contest/93/K
来源:牛客网

题目描述

wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)

一天他突发奇想,想求F(a^b)%c

输入描述:

输入第一行一个整数T(1<=T<=100),代表测试组数
接下来T行,每行三个数 a,b,c (a,b<=2^64) (1<c<1000)

输出描述:

输出第a^b项斐波那契数对c取余的结果
示例1

输入

3
1 1 2
2 3 1000
32122142412412142 124124124412124 123

输出

1
21
3

斐波那契数列对c取模会形成循环节
找循环节+快速幂即可
注意要用unsigned long long
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define read(x) scanf("%lld",&x)
 4 #define out(x) printf("%lld",&x)
 5 #define cfread(x) scanf("%I64d",&x)
 6 #define cfout(x) printf("%I64d",&x)
 7 #define mian main
 8 #define min(x,y) (x<y?x:y)
 9 #define max(x,y) (x<y?y:x)
10 #define f(i,p,q,t) for(i=p;i<q;i+=t)
11 #define MAXN 110000
12 #define inf 0x3f3f3f3f
13 #define mem(x,t) memset(x,t,sizeof(x));
14 #define T true
15 #define F false
16 #define def -1*inf
17 typedef long long ll;
18 typedef long long LL;
19 typedef double dd;
20 typedef unsigned long long ULL;
21 ULL power(ULL a,ULL n,ULL m){
22     if(n==0)
23         return 1;
24     if(n==1)
25         return a%m;
26     ULL p = power(a,n>>1,m);
27     p = ((p%m)*(p%m))%m;
28     if(n&1)
29         p = ((p%m) * (a%m))%m;
30     return p;
31 }
32 ULL f[2000000];
33 void deal(){
34     ULL a,b,c;
35     scanf("%llu%llu%llu",&a,&b,&c);
36     f[0] = 0;
37     f[1] = 1;
38     int i=2;
39     while(true){
40         f[i] = f[i-1] + f[i-2];
41         f[i]=f[i]%c;
42         if(f[i]==f[1]&&f[i-1]==f[0])
43             break;
44         i+=1;
45     }
46     i-=1;
47     ULL ans = f[power(a,b,i)];
48     printf("%llu\n",ans);
49 }
50 int main(){
51     int t;
52     cin>>t;
53     while(t--)
54         deal();
55     return 0;
56 }

 

posted @ 2018-04-06 12:00  晓风微微  阅读(259)  评论(0编辑  收藏  举报