• HDU 2256 Problem of Precision


    HDU_2256

        这个题目用快速幂+fmod是AC不了的,应该是浮点数精度的原因,推导的过程都体现在图上了,剩下的工作就是二分矩阵求解了。

        此外,在计算完x[n]和y[n]之后不能直接用(x[n]+(int)(y[n]*sqrt(6.0)))%1024来得到最后的结果的,先取整再模和先模再取整的结果是不一样的这一点举个例子就比较容易看出来了。

        比如(2000*1.372)%1000,这样先乘再取模得到的结果就是744,如果先把2000模1000,显然最后结果就是0了。

        

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #define MAXD 2
    int N, cnt;
    struct Matrix
    {
        int a[MAXD][MAXD];
        void init()
        {
            a[0][0] = a[1][1] = 5, a[0][1] = 12, a[1][0] = 2;
        }
    }mat[150];
    int multiply(int x, int y)
    {
        int i, j, k, z = ++ cnt, ans;
        for(i = 0; i < 2; i ++)
            for(j = 0; j < 2; j ++)
            {
                ans = 0;
                for(k = 0; k < 2; k ++)
                    ans += mat[x].a[i][k] * mat[y].a[k][j];
                mat[z].a[i][j] = ans & 1023;
            }
        return z;
    }
    int powmod(int n)
    {
        int k;
        if(n == 1)
            return 0;
        k = powmod(n >> 1);
        k = multiply(k, k);
        if(n & 1)
            k = multiply(k, 0);
        return k;
    }
    void solve()
    {
        int k, ans, x, y;
        cnt = 0;
        mat[0].init();
        k = powmod(N);
        ans = (2 * mat[k].a[0][0] - 1 + 1024) & 1023;
        printf("%d\n", ans);
    }
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t --)
        {
            scanf("%d", &N);
            solve();
        }
        return 0;
    }
  • 相关阅读:
    Solr的配置和在java中的使用
    druid + mysql + mybatis 批量更新报错
    linux find命令-print0和xargs中-0使用技巧
    Shell 函数相关
    公钥、私钥和数字签名这样最好理解
    Liunx find/locate/whereis/which 总结
    Linux find命令
    Shell bash 数学运算 bc
    Shell 使用 expr 进行数学运算
    Shell 有类型变量
  • 原文地址:https://www.cnblogs.com/staginner/p/2468380.html
Copyright © 2020-2023  润新知