51nod-1537 1537 分解(矩阵快速幂+找规律)

题目链接:

1537 分解

问(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

题意:

思路:

发现跟奇数偶数有关系,然后就找出递推式,然后就快速幂,然后就A了;

AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>

using namespace std;

#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));

typedef  long long LL;

template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<‘0‘||CH>‘9‘;F= CH==‘-‘,CH=getchar());
    for(num=0;CH>=‘0‘&&CH<=‘9‘;num=num*10+CH-‘0‘,CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + ‘0‘);
    putchar(‘\n‘);
}

const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=1e9;
const int N=5e5+20;
const int maxn=1e4+220;
const double eps=1e-12;

struct matrix
{
    LL a[2][2];
};

matrix cal(matrix A,matrix B)
{
    matrix C;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            C.a[i][j]=0;
            for(int k=0;k<2;k++)
            {
                C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
            }
        }
    }
    return C;
}
matrix pow_mod(LL x)
{
    matrix s,base;
    base.a[0][0]=base.a[1][1]=base.a[1][0]=1;base.a[0][1]=2;
    s.a[0][0]=s.a[1][1]=1;s.a[0][1]=s.a[1][0]=0;
    while(x)
    {
        if(x&1)s=cal(s,base);
        base=cal(base,base);
        x>>=1;
    }
    return s;
}
int main()
{
    LL n,ans=0;
    read(n);
    if(n<0)cout<<"no\n";
    else if(n==0)cout<<"1\n";
    else {
    matrix temp=pow_mod(n-1);
    if(n%2==0)
    {
        ans=(temp.a[0][0]+temp.a[0][1])%mod;
        ans=ans*ans%mod;
    }
    else
    {
        //cout<<temp.a[1][0]<<t
        ans=(temp.a[1][0]+temp.a[1][1])%mod;
        ans=ans*ans%mod*2%mod;
    }
    cout<<ans<<endl;
}
    return 0;
}

  

				
时间: 2024-10-11 23:10:32

51nod-1537 1537 分解(矩阵快速幂+找规律)的相关文章

HDU 6198 number number number 矩阵快速幂 找规律

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6198 题目描述: 给你一个k, 你可以用K个斐波那契数列中的数来构造一个数, 现在我们要求构造不出来的那个最小的数字 解题思路: 首先我们把斐波那契数列写出来, 0, 1, 1, 2, 3, 5, 8, 13, 21, 43 . . . . . . , 我们首先发现当K == 1 的时候构造不出来的数显然是4, 然后2个的时候是12, 三个是33, 然后找规律就是 f(2*n+3)-1 .....

51nod 1537 分解(矩阵快速幂)

分析:先写出前几项,发现都是有解的.记(1+√2)^n=a+b√2,可以归纳证明,当n为奇数时,m=a^2+1,n为偶数时,m=a^2.写出a的递推式,用矩阵快速幂算一下a即可. 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int p=1e9+7; 6 typedef unsigned long long ull; 7 ull mat

Codeforces 450B div.2 Jzzhu and Sequences 矩阵快速幂or规律

Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo 1000000007 (109 + 7). Input The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single i

HDU 4990 Reading comprehension(找规律+矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4990 Problem Description Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include<iostream> #include

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂.然后立马GG. 用2代表m,1代表f.设dp[i][j][k]表示,在第i位,上一位站了的人是j,这一位站的人是k,的合法情况. 递推过去就是,如果j是1,k是2,那么这一位就只能放一个2,这个时猴dp[i][k][2] += dp[i - 1][j][k]; 其他情况分类下就好,然后

A - Number Sequence(矩阵快速幂或者找周期)

Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. Given A, B, and n, you are to calculate the value of f(n). Input The input consists of multiple test cases. Each test case contains 3

51Nod - 1113 矩阵快速幂

51Nod - 1113 矩阵快速幂 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大,只需要输出每个元素Mod (10^9 + 7)的结果. Input 第1行:2个数N和M,中间用空格分隔.N为矩阵的大小,M为M次方.(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N个数,对应N * N矩阵中的1行.(0 <= N[i] <= 10^9) Output 共N行,每行N个数,对应M

51nod 算法马拉松18 B 非010串 矩阵快速幂

非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) Input 一个数n,表示长度.(n<1e15) Output 长度为n的非010串的个数.(对1e9+7取模) Input示例 3 Output示例 7 解释: 000 001 011 100 101 110 111 读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算.假设现在给的

(hdu 6030) Happy Necklace 找规律+矩阵快速幂

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of multiple red and blue beads. Little Q desperately wants to impress his girlfriend,