bzoj 3679 數字之積

2022-05-11 02:39:59 字數 993 閱讀 2631

乙個數x各個數字上的數之積記為\(f(x)\)

《不含前導零》

求[l,r)中滿足\(0的數的個數

最後\(f(x)\)可以拆分成2,3,5,7的乘積,我們就將 \(2,3,5,7\) 壓進狀態,然後就是基礎的數字dp,分是否嚴格小於兩種狀態轉移即可

具體實現需要一些技巧:

預處理出每乙個數含有 \(2,3,5,7\)的個數

預處理出 \(2,3,5,7\) 的冪,方便剪枝

注意數字不能含有 \(0\),我們每dp一位,要新加入 \([1,9]\) 的狀態,即前導零的情況

還有一種解法是用 \(map\) 壓乘積,網上大部分都是這麼做的,也能通過,且簡潔很多

tips:**實現比較簡單,但我已不想再多看一眼我的**....

#include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

const int n=36;

typedef long long ll;

int m,lim[6],pri[6]=;ll f[21][2][33][21][15][13];

char s[22];

ll m5[n],m2[n],m7[n],m3[n];int v[15][6];

ll solve(int *a,int n)

return ret;

}int s1[22],s2[22],l1,l2;

void work()

int main()

BZOJ 3679 數字之積

人生第一道數字dp,首先對於每位數的乘積,有乙個很顯然的轉移方程 d i j 表示 i 位數乘積為 j的方案數,則有 d i j 1 k 9 k j d i 1 k j 然而我們發現j可能很大,但經過實驗發現只有5000餘個,於是我們可以吧第二維下標換成在數表中的排名,單個遞推就可做了 對於區間 1...

BZOJ3679 數字之積

3679 數字之積 time limit 10 sec memory limit 128 mb submit 415 solved 195 submit status discuss description 乙個數x各個數字上的數之積記為f x 不含前導零 求 l,r 中滿足0 f x n的數的個數...

bzoj 3679 數字之積

乙個數x各個數字上的數之積記為f x 不含前導零 求 l,r 中滿足0 f x n的數的個數 我的做法應該在這道題裡面是最差的了,並且 應該是最醜的了 這道題的新奇的地方實際是n的範圍,不然其實上是一道大水題了。但其實也只需要改動一點小地方,因為我們發現數字之積是2,3,5,7的倍數,不會有其他的質...