最近學了矩陣,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...