BZOJ2326 HNOI2011 數學作業

2021-08-17 17:53:35 字數 1384 閱讀 4396

小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題:給定正整數 n 和 m

要求計算 co

ncat

enat

e(1.

.n) con

cate

nate

(1..

n)

modm od

mm

的值,其中 concatenate (1 ..n)是將所有正整數1,

2,…,

n 1,2

,…,n

順序連線起來得到的數。

例如,n=13

n =13

, co

ncat

enat

e(1.

.n) con

cate

nate

(1..

n)

=12345678910111213

12345678910111213

.小c 想了大半天終於意識到這是一道不可能手算出來的題目,

於是他只好向你求助,希望你能編寫乙個程式幫他解決這個問題。

只有一行且為用空格隔開的兩個正整數n和m, 1≤

n≤1018

1 ≤n

≤10

18且1≤

m≤109

1 ≤m

≤109.

僅包含乙個非負整數,表示 concatenate (1 .. n) mod m 的值。

看到資料就知道是矩陣乘法

遞推式也比較簡單

可是i的位數,也就是⌊l

og10i

⌋ ⌊lo

g10i⌋

並不能線性變換出來怎麼辦

直接分組,因為最多只有18種位數,那就做18次矩陣快速冪,每一次⌊l

og10i

⌋ ⌊lo

g10i⌋

是固定的,就比較好求了

hljs cpp">#include

#include

using

namespace

std;

typedef

int _int;

#define int long long

int m;

struct mat

mat operator*(const mat t)

mat operator^(const

int b)

return t;

}};mat cal(int x,int k)

int p[20];

_int main()

printf("%lld\n",ans.a[1][1]);

return

0;}

bzoj 2326 HNOI2011 數學作業

題目大意 給你n,m,求concatenate 1.n mod m的值 concatenate 1.n 代表把1到n連起來 比如n 13時 concatenate 1.n 就是12345678910111213 n 10 1 m 10 9 這題很水,對於n,將其分開,比如145,就分成1 9,10 ...

bzoj2326 HNOI2011 數學作業

一開始一直不理解矩陣乘法是什麼東西。現在有一點自己的想法。對於如f i 1 a f i b,可以構造乙個矩陣b,使矩陣a i 矩陣b 矩陣a i 1 然後利用矩陣快速冪加速。這道題對於不同的位數有不同的遞推式。設位數為k,f i 1 10 k f i i 1,可構造3 3的矩陣 10 k,1,1 0...

BZOJ2326 HNOI2011 數學作業

很容易得到遞推式f i f i 1 10k i 10k 1 i 10k 資料範圍達到 1018 所以很容易想到用矩陣優化。構造矩陣 f i i 1 10k 1101 1001 然後分段開開心心的分段矩乘啦。注意邊界。include include include define n 10005 usi...