bzoj4002 [JLOI2015]有意义的字符串 快速幂

Description

 B 君有两个好朋友,他们叫宁宁和冉冉。

有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 7528443412579576937 之后的结果吧。

Input

一行三个整数 b;d;n

Output

 一行一个数表示模 7528443412579576937 之后的结果。

Sample Input

1 5 9

Sample Output

76

HINT

 0 <b^2 < d< (b +1)2 < 10^18。

题解

http://blog.csdn.net/popoqqq/article/details/45148309

 

沈老师的特征方程,(⊙o⊙)…,然后oj上floor it,是其部分分部分,矩阵乘法即可。

 1 #include<set>
 2 #include<map>
 3 #include<ctime>
 4 #include<queue>
 5 #include<cmath>
 6 #include<cstdio>
 7 #include<vector>
 8 #include<cstring>
 9 #include<iostream>
10 #include<algorithm>
11 
12 #define ll unsigned long long
13 #define mod 7528443412579576937UL
14 using namespace std;
15 ll read()
16 {
17     ll x=0,f=1;char ch=getchar();
18     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
19     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
20     return x*f;
21 }
22 ll b,d,n,A,B;
23 ll mul(ll a,ll b)
24 {
25     ll ans=0;a%=mod;
26     for(ll i=b;i;i>>=1,a=(a+a)%mod)
27         if(i&1)ans=(ans+a)%mod;
28     return ans;
29 }
30 struct M{
31     ll a[2][2];
32     M(){
33         memset(a,0,sizeof(a));
34     }
35     friend M operator*(M a,M b){
36         M ans;
37         for(int i=0;i<2;i++)
38             for(int j=0;j<2;j++)
39                 for(int k=0;k<2;k++)
40                     (ans.a[i][j]+=mul(a.a[i][k],b.a[k][j]))%=mod;
41         return ans;
42     }
43     friend M operator^(M a,ll b){
44         M ans;
45         ans.a[0][0]=ans.a[1][1]=1;
46         for(ll i=b;i;i>>=1,a=a*a)
47             if(i&1)ans=ans*a;
48         return ans;
49     }
50 }a,ans;
51 int main()
52 {
53     b=read();d=read();n=read();
54     A=b;B=(d-b*b)/4;
55     a.a[0][1]=1;a.a[1][0]=B;a.a[1][1]=A;
56     ans.a[0][0]=2;ans.a[1][0]=b;
57     int F=0;
58     if(b*b!=d&&n%2==0)F=1;
59     printf("%lld\n",(((a^n)*ans).a[0][0]-F+mod)%mod);
60 }

 

posted @ 2017-12-29 09:39  Kaiser-  阅读(277)  评论(0编辑  收藏  举报