zoukankan      html  css  js  c++  java
  • F

    HDU - 2256

    神仙题,完全没想到。

    朴素想法,我们开4*4的矩阵,分别记录(sqrt{2}),(sqrt{3}),(sqrt{6}),(1)的系数,然后快速幂。

    但是我们没法对系数取模,因此不能确定整数部分。

    再分析一下,题目让我们求((sqrt{2} + sqrt{3})^{2n}),那不就是((5 + 2sqrt{6})^{n})吗,这成功减少了一个无理数,我们继续用刚才的方法。

    虽然依旧不能算出答案,但是矩阵只要2*2了。

    接下来就是我不会的东西了

    考虑上面的矩阵,我们可以利用它来求得准确解(a+bsqrt{6}),其中(a)可以准确知道,并在计算过程中取模

    采用数学方法消去(bsqrt{6}),我们构造((5-2sqrt{6})^n),其准确值为(a-bsqrt{6})

    ((5+2sqrt{6})^n + (5-2sqrt{6})^n = a+bsqrt{6}+a-bsqrt{6}=2a)

    因为(0 < 5-2sqrt{6} < 1),所以(0 < (5-2sqrt{6})^n < 1)

    (t = (5-2sqrt{6})^n)(lfloor (5+2sqrt{6})^n floor = lfloor 2a - t floor = 2a - 1)

    利用矩阵乘法计算(a)即可

    其实可以类似复数定义一种数为(x+ysqrt{6}),直接算乘法。

    
    #include<bits/stdc++.h>
    using namespace std;
    
    const int mod =  1024;
    
    struct node{
        long long a,b;
    };
    node operator * (node x,node y){
        node c; 
        c.a = (x.a * y.a % mod + x.b * y.b % mod * 6 % mod ) % mod;
        c.b = (x.a * y.b % mod + x.b * y.a % mod ) % mod;
        return c;
    }
    node ksm(node x,int y){
        node z; z.a = 1; z.b = 0;
        while(y){
            if(y & 1) z = z * x;
            y >>= 1;
            x = x * x;
        }
        return z;
    }
    
    int main(){
        int T; scanf("%d",&T);
        while(T --){
            int n; scanf("%d",&n);
            node x; x.a = 5; x.b = 2;
            node y; y.a = 5; y.b = -2;
            x = ksm(x,n); y = ksm(y,n);
            long long ans = (x.a + y.a) % mod;
            ans = (ans - 1 + mod) % mod;
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    webpack-dev-server
    python 基础语言 学习笔记
    react 避免重复渲染
    获取cookie
    解决 canvas 在高清屏中绘制模糊的问题
    h5页面点击事件ios没反应 移动端兼容性问题
    rem 刷新闪烁问题
    谷歌禁止input自动填充表单信息
    react 循环产生定时器
    IOS开发-UI学习-UIWebView,简单浏览器的制作
  • 原文地址:https://www.cnblogs.com/zzhzzh123/p/13356701.html
Copyright © 2011-2022 走看看