洛谷 P3216 HNOI2011 數學作業

2022-02-27 13:31:35 字數 1290 閱讀 1549

最近學了矩陣,kzj大佬推薦了我這一道題目。

乍一眼看上去,沒看出是矩陣,就隨便打了乙個暴力,30分。

然後仔細分析了一波,發現蠻簡單的。

結果全wa了,先看看下面的錯誤分析吧!

首先,設f[n]為最終答案,易得出$$ f[n]=f[n-1]*10+n$$

然後魔改一下:$$ f[n]=f[n-1]*10+n-1 => $$

\[\begin

10&0&0\\

1&1&0\\

1&1&1\\

\end\]

信心一波過樣例提交,0分。

心態炸了,仔細想了想,原來這個矩陣是會變化的。

假設n的位數為k。

\[f[n]=f[n-1]*10^k+n-1$$ 這才是正確的遞推公式。

所以矩陣也要改為:

$$\begin

10^k&0&0\\

1&1&0\\

1&1&1\\

\end\]

那麼,矩陣會成長,怎麼做呢,

我們可以分開處理,初始矩陣 \(f[0] => (0,0,1)\)

從1列舉位數,一直到\(length(n)-1\)位,一直乘\(10^k\)的矩陣\(9*10^\)次。

最後處理\(length(n)\)位,乘以\(10^\)矩陣\(n-\sum_^(9*10^)\)次。

獻上巨弱的醜**吧~

#include using namespace std;

typedef unsigned long long ull;

const int k=0;

ull n,m,len,p,tot;

ull f=,t[4][4];

ull suan(ull,ull);

void fuyan();

void yuzhouzhou();

ull getpow(ull,ull);

string work();

string w=work();

int main()

ull suan(ull x,ull y)

return d%m;

}void fuyan()

void yuzhouzhou()

ull getpow(ull x,ull y)

}p=n-tot;

t[1][1]=getpow(10,len);

t[1][2]=t[1][3]=t[2][3]=0;

t[2][1]=t[2][2]=t[3][1]=t[3][2]=t[3][3]=1;

while (p)

cout<

洛谷P3216 HNOI2011 數學作業

題目描述 小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題 給定正整數 n 和 m,要求計算 concatenate 1 n mod m 的值,其中 concatenate 1 n 是將所有正整數 1,2,n 順序連線起來得到的數。例如,n 13,concatenate 1 n 1...

洛谷P3216 HNOI2011 數學作業

小 c 數學成績優異,於是老師給小 c 留了一道非常難的數學作業題 給定正整數 n 和 m,要求計算 concatenate 1 n mod m 的值,其中 concatenate 1 n 是將所有正整數 1,2,n 順序連線起來得到的數。例如,n 13,concatenate 1 n 123456...

洛谷 P3197 HNOI2008 越獄

來來來,日常水一篇 滑稽 監獄有連續編號為1 n的n個房間,每個房間關押乙個犯人,有m種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄 輸入格式 輸入兩個整數m,n.1 m 10 8,1 n 10 12 輸出格式 可能越獄的狀態數,模1000...