這道題太毒瘤
從起點1開始,每次選擇當前數的任意一位上加上去,問得到n的最小步數以及方案數。多組資料。
例如,從1開始得到100,有很多方法,其中有下面兩種方式:
a. 1-2-4-8-16-17-18-19-20-22-24-28-36-39-48-56-62-68-76-83-91-100
b. 1-2-4-8-16-17-24-28-36-39-48-56-62-68-76-83-91-100
顯然,b只需要17步。
而事實上,有兩種17步的方法。
c. 1-2-4-8-16-22-24-28-36-39-48-56-62-68-76-83-91-100
第一行乙個t
接下來t行每行乙個n
對於每個n輸出得到n的最小步數和方案數,方案數mod 1000000007後輸出
如果無法得到輸出impossible
316100
87
4 1對於20%的資料n<=10^617 2
impossible
對於60%的資料n<=10^9
對於100%的資料n<=10^12,t<=100
不知道大家有沒有注意看它的資料範圍,賊大賊大的,1e12!從這裡就可以看出這道題是有多毒瘤,bzoj這道題一共就只有4個人過了。
好,現在開始講1e9的做法:
定義f[s][a][b](0<=s<=2^9, 0<=a<=9, 0<=b<=9)
s表示乙個狀壓的狀態,它的9位中的0表示那一位對應的數字不能用,1表示那一位對應的數字能用。
a和b表示從a狀態跳到b狀態。
f[s][a][b]就表示從a狀態跳到b狀態耗費的步數。
這裡我們就可以三位三位地跳,就是說從00a跳到00b,只要首先暴力預處理出100組(a,b)配對的所有情況就行了。
但這樣會炸,下面講一下1e12的做法:
我們將f定義為4維f[d][s][a][b](1<=d<=12)
前面我們只能三位三位地跳,現在我們就可以d位d位地跳。
如果我們想跳d位,就可以通過d-1轉移過來,比如:
s0000a(前面s位已經確定)跳到s0000b就可以:通過s+1000a跳到s0000b
那麼最後答案的步數和方案數的演算法通過樣例就行:
001 -> 101 ->201 -> 301 -> 401 -> 501 -> 511 -> 521 -> 531 -> 541 -> 551 -> 561 -> 571
最後懂了不一定能實踐,具體要看**:
#include #include #include #include #include #include using namespace std;
#define mod 1000000007
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define ll long long
ll f[15][600][15][15], fs[15][600][15][15], tmp[15][15], tmps[15][15], t, n;
bool vis[600];
void get_it (ll s)
void init ()}}
}} }
for (ll i = 2; i <= 12; i ++)}}
for (ll t = 0; t <= 8; t ++)
f[i][s][s][t] = tmp[10][t], fs[i][s][s][t] = tmps[10][t];
}} }
}int main ()}}
if (((n / i) % 10)) s |= 1 << ((n / i) % 10 - 1);
} for (ll i = 0; i <= 9; i ++)
}} if (tmp[t][n % 10] == llinf)
printf ("impossible\n");
else
printf ("%lld %lld\n", tmp[t][n % 10], tmps[t][n % 10]);
} return 0;
}
BZOJ 3209 花神的數論題 數字DP 數論
題目大意 令sum i 為i在二進位制下1的個數 求 1 i n sum i 一道很簡單的數字dp 首先我們打表打出組合數 然後利用數字dp統計出二進位制下1的個數為x的數的數量 最後輸出 1 x logn x ans x 即可 此題的坑在於這題的組合數和數字dp的結果都是指數 對指數取模不能直接取...
bzoj3930 數論 選數
description 我們知道,從區間 l,h l和h為整數 中選取n個整數,總共有 h l 1 n種方案。小z很好奇這樣選出的數的最大公約數的規律,他決定對每種方案選出的n個整數都求一次最大公約數,以便進一步研究。然而他很快發現工作量太大了,於是向你尋求幫助。你的任務很簡單,小z會告訴你乙個整數...
bzoj2749 外星人 數論
一開始還以為求方程 n x 1的解。後來看了半天沒有發現模數。原來下面還有樣例解釋。注意到解釋中有乙個 2 1,即為這道題目的突破口。乙個顯然的事實是,要消去pi這個質數,至少需要qi次。而求一次 x pi就會分解出乙個質因數2。而2分解以後就只剩下1了。而每次只能消去1個2,所以實際上是求能夠分解...