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 }