BZOJ3679 數字之積

2021-08-04 12:02:07 字數 1206 閱讀 8666

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的數的個數

input

第一行乙個數n

第二行兩個數l、r

output

乙個數,即滿足條件的數的個數

sample input

5 19 22

sample output

1hint

100% 0 < l < r < 10^18 , n <= 10^9

很基礎的數字dp。

f[i][j]表示前i位各位數字乘積為j的方案數。

將乘積離散化,最多只有5194個。

然後在bzoj上莫名就rank1了?

#include 

#define n 22

#define m 5210

#define ll long long

using namespace std;

ll l,r,n,f[n][m],g[n][m],num[m],prev[m][10],d[2][n];

int cnt=0;

void pre()}}

sort(num+1,num+1+cnt);

for (int i=1;i<=cnt;i++)

for (ll j=1;j<10 && num[i]*j

<=n;j++)

prev[lower_bound(num+1,num+1+cnt,num[i]*j)-num][j]=i;

}void calc()

}ll solve(int

x) for (int i=1;ix][0];i++)

ans+=g[i][upper_bound(num+1,num+1+cnt,n)-num-1];

return ans;

}int main()

pre();

calc();

printf("%lld\n",solve(1)-solve(0));

return

0;}

BZOJ 3679 數字之積

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

bzoj 3679 數字之積

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

bzoj 3679 數字之積

乙個數x各個數字上的數之積記為 f x 不含前導零 求 l,r 中滿足 0的數的個數 最後 f x 可以拆分成2,3,5,7的乘積,我們就將 2,3,5,7 壓進狀態,然後就是基礎的數字dp,分是否嚴格小於兩種狀態轉移即可 具體實現需要一些技巧 預處理出每乙個數含有 2,3,5,7 的個數 預處理出...