bzoj 2999 inint 數論 暑假篇

2021-09-25 14:17:00 字數 2180 閱讀 9585

這道題太毒瘤

從起點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

3

16100

87

4 1

17 2

impossible

對於20%的資料n<=10^6

對於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,所以實際上是求能夠分解...