BZOJ2326 HNOI2011 數學作業

2022-05-19 20:09:10 字數 1077 閱讀 2660

給出n和m,要求計算concatenate(1...n)%m的值,其中concatenate(1...n)是將所有正整數1,2,…,n順序連線起來得到的數

例如,n=13,concatenate(1...n)=12345678910111213

矩陣乘法

因為肯定不能暴力算,太大了

所以我們用矩陣記錄當前的%了之後的值和當前到達哪乙個正整數了

然後一位一位地處理,因為數的位數影響答案

如果n包含了兩位數的所有數,那麼10到99就每加乙個之前都要乘上100

很好的矩陣題,注意long long的處理

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;ll bin[

21];

struct

node

}sum,cmd;

ll m;

node chengfa(node a,node b)}}

returnc;}

node p_mod(node a,ll b)

return

ans;

}int

main()

sum.a[

1][1]=0ll;sum.a[1][2]=0ll;sum.a[1][3]=1ll;

for(int i=1;i)

cmd.a[

1][1]=bin[len]%m;

cmd.a[

2][1]=1ll;cmd.a[2][2]=1ll;

cmd.a[

3][1]=1ll;cmd.a[3][2]=1ll;cmd.a[3][3]=1ll;

sum=chengfa(sum,p_mod(cmd,n-bin[len-1]+1

)); printf(

"%lld\n

",sum.a[1][1

]);

return0;

}

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