2013 ACM-ICPC长沙赛区全国邀请赛——A So Easy!

这题在比赛的时候不知道怎么做,后来看了别人的解题报告,才知道公式sn=(a+sqrt(b))^n+(a-sqrt(b))^n;

具体推导

 

 1 #include<iostream>

 2 #include<stdio.h>

 3 #include<algorithm>

 4 #include<iomanip>

 5 #include<cmath>

 6 #include<string>

 7 using namespace std;

 8 struct ma

 9 {

10     __int64 a[2][2];

11     void init()

12     {

13         a[0][0]=a[1][1]=1;

14         a[0][1]=a[1][0]=0;

15     }

16 };

17 int mod;

18 ma mul(ma a,ma b)

19 {

20     ma ans;

21     int i,j,k;

22     for(i=0;i<2;i++)

23         for(j=0;j<2;j++)

24         {

25             ans.a[i][j]=0;

26             for(k=0;k<2;k++)

27                 ans.a[i][j]=(ans.a[i][j]%mod+((a.a[i][k]%mod)*(b.a[k][j]%mod)%mod))%mod;

28         }

29     return ans;

30 }

31 ma pows(ma a,__int64 n)

32 {

33     ma ans;

34     ans.init();

35     while(n)

36     {

37         if(n&1)

38             ans=mul(ans,a);

39         n>>=1;

40         a=mul(a,a);

41     }

42     return ans;

43 }

44 int main()

45 {

46     int a,b,n;

47     __int64 sum,q,s;

48     while(scanf("%d%d%d%d",&a,&b,&n,&mod)!=EOF)

49     {

50         ma p,ans;

51         s=2*a%mod;

52         p.a[0][0]=s;

53         p.a[0][1]=(b-a*a)%mod;

54         p.a[1][0]=1;

55         p.a[1][1]=0;

56         q=((2*a*a)%mod+2*b%mod)%mod;

57         ans=pows(p,n-1);

58         sum=(((ans.a[1][0]%mod)*(q%mod))%mod+((ans.a[1][1]%mod)*(s%mod)))%mod;

59         if(sum<0) sum=(sum+mod)%mod;

60         printf("%I64d\n",sum);

61     }

62     return 0;

63 }
View Code

 

你可能感兴趣的:(ICPC)