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難...