乙個數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的倍數,不會有其他的質...