POJ 3233 Matrix Power Series 矩陣快速冪 + 二分

題意:求矩陣的次方和

解題思路:最容易想到方法就是兩次二分因為 我們可以把一段 ?A^1 + A^2 + .......A^K ? 變成 ?A^1 + ..A^(K/2) +(?A^1 + ..A^(K/2))*(A^(k/2)) 當k 為奇數的時候 或者?A^1 + ..A^(K/2) +(?A^1 + ..A^(K/2))*(A^(k/2)) + A^K 當K 為偶數的時候。

解題代碼:

  1 // File Name: temp.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年09月17日 星期三 11時35分45秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 using namespace std;
 26 int  n ,m , k ; 
 27 int  ta,tb;
 28 struct Matrix
 29 {
 30    int   mat[30][30];
 31    void clear()
 32    {
 33       memset(mat,0,sizeof(mat));
 34    }
 35    void output()
 36    {
 37      for(int i =0  ;i < n ;i ++)
 38      {
 39        for(int j = 0 ;j < n ;j ++)
 40            printf("%d ",mat[i][j]);
 41      printf("\n");
 42      }
 43    }
 44    void init()
 45    {
 46       clear();
 47       for(int i = 0 ;i < n;i ++)
 48           for(int j = 0 ;j < n;j ++)
 49           {
 50             scanf("%d",&mat[i][j]);
 51           }
 52    }
 53    Matrix operator *(const Matrix &b) const
 54    {
 55        Matrix ret;
 56        ret.clear();
 57        for(int i = 0 ;i < n ;i ++)
 58            for(int j = 0;j < n;j ++)
 59            {
 60                for(int s = 0 ;s < n ;s ++)
 61                {
 62                  ret.mat[i][j] =(ret.mat[i][j] + mat[i][s] * b.mat[s][j]) % m ; // 第I 行  第J  列        
 63                }
 64            }
 65        return ret;
 66    }
 67    Matrix operator *(const int  &b) const
 68    {
 69        Matrix ret;
 70        ret.clear();
 71        for(int i = 0 ;i < n ;i ++)
 72            for(int j = 0;j < n;j ++)
 73            {
 74                 ret.mat[i][j] = (mat[i][j] * b) % m ; // 第I 行  第J  列        
 75            }
 76        return ret;
 77    }
 78    Matrix operator +(const Matrix &b) const
 79    {
 80        Matrix ret;
 81        ret.clear();
 82        for(int i = 0 ;i < n ;i ++)
 83            for(int j = 0;j < n;j ++)
 84            {
 85                 ret.mat[i][j] = (mat[i][j] + b.mat[i][j]) % m ; // 第I 行  第J  列        
 86            }
 87        return ret;
 88    }
 89 };
 90 Matrix Pow( Matrix a ,LL t )
 91 {
 92   Matrix ret;
 93   ret.clear();
 94   for(int i = 0 ;i < n ;i ++)
 95        ret.mat[i][i] = 1;
 96   Matrix tmp = a; 
 97   while(t)
 98   {
 99       if(t&1) ret = ret * tmp;
100       tmp = tmp * tmp;
101       t >>=1;
102   }
103   return ret;
104 }
105 Matrix add(Matrix a, int k )
106 {
107     Matrix ans;
108     ans.clear();
109     if(k == 1)
110     {
111       return a;
112     }
113     if(k&1)
114     {
115           Matrix temp = add(a,k/2);
116           ans = temp + temp * Pow(a,k/2) + Pow(a,k);
117     }else{
118           Matrix temp = add(a,k/2);
119           ans = temp + temp * Pow(a,k/2);
120     }
121     return ans ; 
122 }
123 int main(){
124     LL l ;
125     while(scanf("%d %d %d",&n,&k,&m) != EOF)
126     {
127         Matrix  a;
128         a.clear();
129         a.init();
130         a = add(a,k);
131         //a.output();
132         a.output();
133     }
134     return 0;
135 }
View Code

寫完以后過了竟然跑了 1300+ms ?最快 0ms ?不能忍上網查題解 發現了這種方法 :http://www.cnblogs.com/rainydays/archive/2011/02/21/1960189.html

他的主要思想是多加 n維度 構成一個能累加的矩陣 ,具體看博主題解。

這種思想很巧妙。

?

轉載于:https://www.cnblogs.com/zyue/p/3979014.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376650.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

時間序列進行分析的一些手法以及代碼實現(移動平均、指數平滑、SARIMA模型、時間序列的(非)線性模型)

文章目錄1、移動平均moving average方法weighted average方法2、指數平滑單指數平滑 exponential_smoothing雙指數平滑三指數平滑 Triple exponential smoothing3、平穩性以及時間序列建模SARIMA模型4、時間序列的&#xff08;非&#xff09;線性模型時間序列的滯后值使用線性回…

政權組織形式

神馬國家結構、政權組織形式的 現在我比較明確的是英國的政權組織形式是式君主立憲制、美國是總統制、中國是人民代表大會制。 目前,世界各國采用的國家結構可分為單一制和復合制兩大類。其中&#xff0c;復合制國家結構形式主要包括聯邦制和邦聯制兩種類型。英國、法國、意大利…

三大平衡樹(Treap + Splay + SBT)總結+模板

Treap樹 核心是 利用隨機數的二叉排序樹的各種操作復雜度平均為O(lgn) Treap模板&#xff1a; #include <cstdio> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath…

mysqld進程 ut_delay 占用率過高

采用性能分析工具perf top -p mysqld進程 在測試mysql數據庫時&#xff0c;用perf top如果看到熱點函數是ut_delay或者_raw_spin_lock的話&#xff0c;說明鎖爭用比較嚴重。 ut_delay這是innodb的一個自旋瑣。也就是說&#xff0c;在這里由于鎖等待&#xff0c;innodb不停地在…

TClientDataSet使用要點

TClientDataSet控件繼承自TDataSet&#xff0c;其數據存儲文件格式擴展名為 .cds&#xff0c;是基于文件型數據存儲和操作的控件。該控件封裝了對數據進行操作處理的接口和功能&#xff0c;而本身并不依賴上述幾種數據庫驅動程序&#xff0c;基本上能滿足單機"瘦"數據…

滑動窗口在重構數據集的作用

step1&#xff1a;使用滑動窗口重構數據集 給定時間序列數據集的數字序列&#xff0c;我們可以將數據重構為看起來像監督學習問題。 我們可以通過使用以前的時間步作為輸入變量并使用下一個時間步作為輸出變量來做到這一點。 通過觀察重構后的數據集與原本的時間序列&…

sliverlight - Unhandled Error in Silverlight Application錯誤

使用firebug控制臺輸出錯誤&#xff1a; Unhandled Error in Silverlight Application 查詢“GetFlow_Process”的 Load 操作失敗。遠程服務器返回了錯誤: NotFound。 位于 System.ServiceModel.DomainServices.Client.OperationBase.Complete(Exception error) 位于 System.S…

前向驗證對于模型的更新作用

首先&#xff0c;讓我們看一個小的單變量時間序列數據&#xff0c;我們將用作上下文來理解這三種回測方法&#xff1a;太陽黑子數據集。該數據集描述了剛剛超過 230 年&#xff08;1749-1983 年&#xff09;觀察到的太陽黑子數量的每月計數。 數據集顯示了季節之間差異很大的…

2014年9月21日_隨筆,jdic,ETL,groovy,Nutz好多東西想學

&#xff08;1&#xff09;老媽十一要回老家&#xff0c;才突然發現買票好難啊。有親朋很重要 &#xff08;2&#xff09;這周我做了什么。jdic,ETL,groovy, Nutz好多東西想學。 Nutz開發成員專訪、Nutz優酷視頻(演講)、Nutz 入門教程、 &#xff08;3&#xff09;想改變&#…

PHP-面向對象(八)

1、多態的介紹與優勢 多態性是繼抽象和繼承后&#xff0c;面向對象語言的第三個特征。從字面上理解&#xff0c;多態的意思是“多種形態”&#xff0c;簡單來說&#xff0c;多態是具有表現多種形態的能力的特征&#xff0c;在OO中是指“語言具有根據對象的類型以不同方式處理。…

雙指數平滑中參數對于預測模型的影響

先看看α 在β一致的情況下&#xff0c;α越小&#xff0c;模型越滯后。 再看看β 在α一致的情況下&#xff0c;β越大&#xff0c;模型對于趨勢的預測更敏銳。

SQL 性能不佳的幾個原因

SQL 性能不佳的幾個原因 ?不準確的統計數據?差勁的索引?差勁的查詢設計 ?差勁的執行計劃&#xff0c;通常是由不正確的參數引起的?過度阻塞和死鎖 ?非基于集合的操作?不良數據庫設計 ?過度碎片 ?不能重復使用執行計劃 ?查詢頻繁重編譯 ?不當使用游標 ?數據庫日志的…

分頁查詢

分頁查詢算是比較常用的一個查詢了在DAO層主要是查兩個數據第一個總條數第二個要查詢起始記錄數到查詢的條數當第一次點擊查詢時候(非下一頁時Page類里面預設的就是 index就是0 pageSize是預設值當點擊下一頁的時候 index 和 pageSize帶的就是頁面上面給的值了分頁的頁面一般的…

TypeError: Object of type ‘datetime‘ is not JSON serializable

python中這個錯誤的原因是json.dumps無法對字典中的datetime時間格式數據進行轉化&#xff0c;dumps的原功能是將dict轉化為str格式&#xff0c;不支持轉化時間. 所以請這樣使用&#xff1a; json.dumps(response_data, defaultstr)

oracle問題

ORA-01031: insufficient privileges 用戶沒有權限&#xff0c;給它賦予角色轉載于:https://www.cnblogs.com/50614090/p/3986880.html

me23n去價格

SELECT knumv kposn AS ebelp kschl kbetr kpein kwert INTO CORRESPONDING FIELDS OF TABLE gt_konv FROM konv FOR ALL ENTRIES IN gt_ekpo WHERE knumv gt_ekpo-knumv AND kinak EQ AND kschl IN (PB00,PBXX,P101).轉載于:…

Fix “Windows cannot access the specified device path or file” Error

http://helpdeskgeek.com/help-desk/windows-cannot-access-the-specified-device-path-or-file/ Method 1 – Windows Server 2003 Terminal Services Firstly, if you’re running into this issue on a Windows Server box running Terminal Services, your problem can be …

使用Bootstrap-table創建表單,并且與flask后臺進行數據交互

文章目錄引用css和js使用htmljavascriptflaskmysql參考引用css和js Bootstrap-table為這些文件提供了 CDN 的支持&#xff0c;所以不需要下載.js .css文件就可以直接用了&#xff0c;十分方便 <!-- Latest compiled and minified CSS --> <link rel"stylesheet…

php編碼規則(一)

---恢復內容開始--- <轉載自己整理> GNU C 庫&#xff08;GNU C Library&#xff0c;又稱為glibc&#xff09;是一種按照LGPL許可協議發布的&#xff0c;公開源代碼的&#xff0c;免費的&#xff0c;方便從網絡下載的C的編譯程序。 GNU C運行期庫&#xff0c;是一種C函數…

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件...

重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件 原文:重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳文件[源碼下載] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下載數據, 上傳數據, 上傳…