51nod 算法马拉松17 解题报告 以后不能赛中写题解(查逐梦者抄袭本人代码...
2024-08-26 06:28:57
B题(数学题:
问(1+sqrt(2)) ^n 能否分解成 sqrt(m) +sqrt(m-1)的形式
如果可以 输出 m%1e9+7 否则 输出no n<=1e18
刚看题没思路 暴力一下吧 发现根本没有no的情况 那么就好办多了
所求的值序列为 1, 2, 9, 50, 289, 1682, 9801, 57122, 332929, 1940450, 11309769
设(1+sqrt(2)) ^n为 A_n+B_n*sqrt(2) ,则:
A_n = A_(n-1)+2*B_(n-1)
A_n = A_(n-1)+B_(n-1)
那么所求值序列显然为A_n*A_n+(n&1)
我们需要求这个A_n 暴力肯定不行,看到上面的递推式可以想到矩阵快速幂---
这个矩阵构造也非常简单
/*
1 2 A_n A_(n+1)
* =
1 1 B_n B_(n+1)
*/
然后注意下细节
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstring>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
inline void r(ll&num){
num=;ll f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
inline void r(int &num){
num=;int f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
const long long N = ;
const long long M = 1e9+;
struct Matr
{
long long line;
long long a[N+][N+];
Matr(){
line=;
a[][] = ; a[][] = ;
a[][] = ; a[][] = ;
}
};
Matr isit(Matr x,long long c) //矩阵初始化
{
for(long long i=;i<N;i++)
for(long long j=;j<N;j++)
x.a[i][j]=c;
return x;
} Matr Matlab(Matr x,Matr s) //矩阵乘法
{
Matr ans;
ans.line = x.line;
ans=isit(ans,);
for(long long i=;i<x.line;i++)
{
for(long long j=;j<x.line;j++)
{
for(long long k=;k<s.line;k++)
{
ans.a[i][j] = (ans.a[i][j]+x.a[i][k]*s.a[k][j])%M;
ans.a[i][j]=(ans.a[i][j]+M)%M;
}
}
}
return ans;
}
long long Fast_Matrix(Matr tmp,long long n)
{
if(n==)
return ;
if(n==)
return ;
if(n==)
return ;
n--;
Matr ans,ch;
ans.line = ;
ans.a[][] = ;
ans.a[][] = ;
ans.a[][] = ;
ans.a[][] = ;
while(n>)
{
if(n%)
{
ans=Matlab(ans,tmp);
}
tmp=Matlab(tmp,tmp);
n/=;
}
return (ans.a[][]+ans.a[][])%M;
}
int main()
{
Matr T;
long long n;
cin>>n;
long long x = Fast_Matrix(T,n);
cout<<(x*x+(n&))%M<<endl;
return ;
}
AC代码
最新文章
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
- C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
- 在javascrit中怎样来刷新页面
- [java] 汇率换算器实现(2)
- Linux 服务器的网络配置 - 1. 查看 Linux 服务器的网络连接
- 在linux服务器上装svn版本管理,自动部署代码到项目
- 企业用户2T(含秒传),普通用户20G
- 重装mysql步骤
- 【HTTP】IE的URL的最大长度限制和如何解决URL最大长度的限制
- iOS 6分享列表——UIActivityViewController详解
- WebService之CXF注解报错(一)
- #if和#ifdef区别
- JavaScript高级程序设计---学习笔记(一)
- ssh整合开发
- 心路历程:当win10遇上win7激活程序...请默哀
- [translation]The rise of college ‘Grade Forgiveness’
- sqlserver 数据库插入汉字变成乱码的解决方案
- WordPress UpdraftPlus插件 Google Drive 备份
- JAVA面对对象(一)——封装
- hdu1505City Game(扫描线)