题意:
给出a,b,n,m;
0< a, m < 2 15, (a-1) 2< b < a 2, 0 < b, n < 2 31
求
思路:
不会写,看来别人的博客补的。。。。。。
题目重点在于
(a-1) 2< b < a 2
即 a-1<sqrt(b)<a
(a−√b) < 1
(a−√b)^n <1
令 cn= (a+√b)^n + (a−√b)^n
这里提到 (a+√b)^n 与 (a−√b)^n 共轭,所以二者相加的cn为整数
又因为 (a-sqrt(b))^n <1
所以 Cn=⌈An⌉
得到这个还不够我们得求出Cn
Cn*((a+√b) + (a−√b))
=((a+√b)^n + (a−√b)^n)*((a+√b) + (a−√b))
=((a+√b)^(n+1) + (a−√b)^(n+1) + (a+√b)^n * (a-√b) + (a-√b)^n * (a+√b)
= Cn+1 +(a+√b)^n-1 * (a+√b)* (a-√b) + (a-√b)^n-1 * (a+√b)* (a-√b)
= Cn+1 + Cn-1*(a^2-b)
Cn+1 = Cn*(2a) - Cn-1*(a^2-b)
| C1 C0 | | 2a 1| ^ n
| 0 0 | | b-a*a 0|
#include<bits/stdc++.h>
using namespace std;
long long N;
struct node
{
long long a[2][2];
};
node cheng(node a,node b)
{
node c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<2;i++){
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
}
return c;
}
int main()
{
long long a,b,n,m;
node x,y;
while(~scanf("%lld%lld%lld%lld",&a,&b,&n,&m))
{
x.a[0][0]=2*a;
x.a[0][1]=2;
x.a[1][0]=0;
x.a[1][1]=0;
y.a[0][0]=2*a;
y.a[0][1]=1;
y.a[1][0]=b-a*a;
y.a[1][1]=0;
N=m;
n--;
while(n)
{
if(n&1) x=cheng(x,y);
n>>=1;
y=cheng(y,y);
}
printf("%lld\n",(x.a[0][0]%N+N)%N);
}
return 0;
}