51nod-1537分解

1537 分解
基准时间限制:0.5 秒 空间限制:131072 KB 分值: 80  难度:5级算法题
 收藏
 关注
 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式 
如果可以 输出 m%1e9+7 否则 输出no

Input
一行,一个数n。(n<=10^18)
Output
一行,如果不存在m输出no,否则输出m%1e9+7
Input示例
2
Output示例

9


算是马拉松17的签到题了,把另一道矩阵快速幂的AC代码小改一下就可以AC....看成ax+by的形式(a=1,b=根号2)就很容易构造出矩阵....

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
//#define min(a,b) (a>b?b:a)
//#define max(a,b) (a>b?a:b)
#define mem(a,num) memset(a,num,sizeof(a))
#define inf(a,n) fill(a,a+n,0x3f3f3f3f)

ll N = 2;
const ll M = 1e9+7;

struct mat
{
	ll a[2][2];
};

mat mul(mat a,mat b)
{
	mat c;
	memset(c.a,0,sizeof(c.a));
	for(int i=0;i0)
	{
		if(n&1)b=mul(a,b);
		a=mul(a,a);
		n>>=1;
	}
	return b;
}

int main()
{
	ll n;
	mat a;
	while(~scanf("%lld",&n))
	{
		for(int i=0;i



你可能感兴趣的:(矩阵快速幂,51nod)