HDU - 4565 So Easy!

题意:

给出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;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值