zoukankan      html  css  js  c++  java
  • hdu 2256 Problem of Precision

    Problem of Precision

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1695    Accepted Submission(s): 1047


    Problem Description
     
    Input
    The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)
     
    Output
    For each input case, you should output the answer in one line.
     
    Sample Input
    3
    1
    2
    5
     
    Sample Output
    9
    97
    841
     
    (√2+√3)2n = (5+2√6)n =  xn + yn√6 , 即xn + yn√6 = (xn-1 + yn-1√6)*(5+2√6) = (5xn-1+12yn-1)+(5√6yn-1+2√6xn-1)
     
    由于有根号,浮点求模有误差
    同理可得(5+2√6)n + (5-2√6)n = 2Xn
    (5-2√6)n < 1
    所以(5+2√6)n = 2Xn-1
    (5+26)n+(526)n=2A
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int mod = 1024;
     4 typedef vector<int> vec;
     5 typedef vector<vec> mat;
     6 
     7 mat mul(mat &A, mat &B) {
     8     mat C(A.size(), vec(B[0].size()));
     9     for(int i = 0; i < A.size(); i ++) {
    10         for(int j = 0; j < B[0].size(); j ++) {
    11             for(int k = 0; k < B.size(); k ++) {
    12                 C[i][j] = (C[i][j] + A[i][k]*B[k][j]);
    13             }
    14             C[i][j] %= mod;
    15         }
    16     }
    17     return C;
    18 }
    19 
    20 mat pow(mat A, int n) {
    21     mat B(A.size(), vec(A[0].size()));
    22     for(int i = 0; i < B.size(); i ++) B[i][i] = 1;
    23     while(n) {
    24         if(n&1) B = mul(A, B);
    25         A = mul(A, A);
    26         n >>= 1;
    27     }
    28     return B;
    29 }
    30 
    31 int main() {
    32     int t, n;
    33     cin >> t;
    34     while(t--) {
    35         cin >> n;
    36         mat A(2, vec(2));
    37         A[0][0] = 5; A[0][1] = 12;
    38         A[1][0] = 2; A[1][1] = 5;
    39         A = pow(A, n-1);
    40         // cout << A[0][0]*5+A[0][1]*2 << ' ' << A[1][0]*5+A[1][1]*2 << endl;
    41         int ans = (A[0][0]*5+A[0][1]*2)*2-1;
    42         cout << ans%mod << endl;
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    Linux内核之旅 链表实现
    Linux内核之旅 List_entry()
    希尔排序
    华为2013校园招聘上机笔试题 ---2 字符串处理转换
    编程求凸包点集
    练习一:SQLite基本操作
    java实现单链表反转
    android-数据存储之外部file存储(sdcard)
    android-数据存储之手机内部file存储
    android-数据存储之SharedPreferences
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/8994361.html
Copyright © 2011-2022 走看看