calc 計算 題解(矩陣乘法優化動態規劃)

2021-06-09 19:31:18 字數 1557 閱讀 2483

4

計算 calc

4.1問題描述

求滿足以下條件的數 x 的個數模 m :

n 位數

各位數字不大於 k

x ≡ p (mod d)

4.2輸入格式

一行 5 個數:k,n,d,p,m 。

4.3輸出格式

一行乙個數,表示個數模 m 。

4.4樣例輸入

5 4 3 1 100007

4.5樣例輸出

2084.6

資料規模

對於 30% 的資料:n ≤ 5

對於 70% 的資料:n ≤ 1000

對於 100% 的資料:n ≤ 10^18,0 ≤ p < d ≤ 10,1 ≤ k ≤ 9

看起來很難的樣子。考試的時候我打表找規律矩陣乘法過了 50 分(分類討論太多沒寫完)。

其實不難發現這道題得七十分還是相當容易的:數字 dp 。事實上我一開始根本就沒往那方面去想。

如何 dp 呢?可以考慮每一位上列舉數字,然後得到取模,再往下轉移。即**出):

f[i + 1][(j * 10 + j ') % d] = σ f[i][i][j '],其中 j 為所列舉的下一位 mod d 的餘數,j ' 為所列舉的當前位數字。

正確性很顯然。假設 1111 mod d = 1, 那麼 (1 * 10 + j) % d = 1111j % d,對於所有的 j 往其轉移即可(我覺得轉出比較方便取模)。

那剩下的 30 分呢?再仔細觀察算式,不難發現:

對於每乙個給定的 j,總有給定的集合中每個元素 j 『 滿足 (j ' * 10 + l) % d == j,其中 l 為每次轉移時都需要列舉的 1 .. k。

這說明了什麼?即這個方程沒有所謂的決策,每一次轉移都有相同的模式,也就是說是遞推式。

講到這裡已經很明顯了,矩陣乘法快速冪。

code :

#include #include #include #include #include #include typedef long long int64;

typedef unsigned int uint;

typedef unsigned long long uint64;

#define swap(a, b, t) ()

#define max(a, b, t) ()

#define min(a, b, t) ()

typedef int maintype;

#define max(a, b) max(a, b, maintype)

#define min(a, b) min(a, b, maintype)

#define maxn 1005

#define maxm 10

int64 n, mo;

int k, d, p;

struct matrix

} a, b, c;

matrix operator *(matrix & a, matrix & b)

int main()

程式設計開發A B計算題解析

程式設計開發a b計算題解析。本題要求你計算a b。不過麻煩的是,a和b都是字串 即從字串a中把字串b所包含的字元全刪掉,剩下的字元組成的就是字串a b。輸入格式 輸入在2行中先後給出字串a和b。兩字串的長度都不超過104,並且保證每個字串都是由可見的ascii碼和空白字元組成,最後以換行符結束。輸...

百練2967 特殊日曆計算題解

總時間限制 1000ms 記憶體限制 65536kb 描述 有一種特殊的日曆法,它的一天和我們現在用的日曆法的一天是一樣長的。它每天有10個小時,每個小時有100分鐘,每分鐘有100秒。10天算一周,10周算乙個月,10個月算一年。現在要你編寫乙個程式,將我們常用的日曆法的日期轉換成這種特殊的日曆表...

OneCode(天梯四) D 難度計算(題解)

一碼學程題目鏈結 天梯四d onecode tianti 4 d 此題是一道動歸題,本人在寫此題的時候根本沒看出動歸,居然在那shaziyiyangde列舉 結果證明,列舉是肯定不行的 想列舉到一分?這輩子都不可能 我們可以分情況來看,當然,本題題目已經給出了所有情況 no.1 所有數字都相同 1難...