bzoj 3679 數字之積

2022-05-21 19:48:11 字數 3022 閱讀 4259

注意到每個數字的質因子只會有2,3,5,7四種,所以分開統計,數字dp

此題卡空間,最好是寫成迴圈,用滾動陣列,我這裡是卡了好久才過去的

1 #include2 #include3 #include4

using

namespace

std;

5 typedef long

long

ll;6 ll dp[55][37][19][19][19

];7 ll d2=;

8 ll d3=;

9 ll d5=;

10 ll d7=;

11 ll g[30

],glen;

12 ll dfs(ll pos,ll a,ll b,ll c,ll d,bool limit,bool

pre0)

1323 ll get

(ll a,ll b,ll c,ll d)

2429

ll n,l,r;

30 ll pw2[70],pw3[70],pw5[70],pw7[70

];31

bool

judge(ll a,ll b,ll c,ll d)

3241

ll ans;

42int

main()

4363

for(glen=0;r;r/=10) g[++glen]=r%10;64

for(i=0;i<=55;i++)

65for(j=0;j<=37;j++)

66for(k=0;k<=19;k++)

67for(l=0;l<=19;l++)

6872

for(glen=0;l;l/=10) g[++glen]=l%10;73

for(i=0;i<=55;i++)

74for(j=0;j<=37;j++)

75for(k=0;k<=19;k++)

76for(l=0;l<=19;l++)

7781 printf("

%lld

",ans);

82return0;

83 }

view code

用迴圈重新寫了一遍

錯誤記錄:沒有判138行"!has0[p+1]",無限wa

1 #include2 #include3 #include4 #include5

using

namespace

std;

6#define fi first

7#define se second

8#define mp make_pair

9#define pb push_back

10 typedef long

long

ll;11 typedef unsigned long

long

ull;

12 typedef pairpii;

13 ll g[22

];14

namespace

s11529}

30 ll calc()//

[1,g)之間有多少個數數字中有0

3137

if(g[g[0]]!=0)//

g[0]位取1~(g[g[0]]-1)

38 ans+=(g[g[0]]-1)*(an[g[0]-1][1][0]+an[g[0]-1][1][1

]);39

bool ok=0;40

for(i=g[0]-1;i>=1;i--)//

i位之前與原數相同,i位小於原數,i位以後任意取

4148 ok|=(g[i]==0

);49}50

//if(ok) ans++;

51return

ans;52}

535455}

56/*

57xx2:;

58int main()

5967

return 0;68}

69*/

70 ll d2=;

71 ll d3=;

72 ll d5=;

73 ll d7=;

74 ll s2[22],s3[22],s5[22],s7[22

];75

bool has0[22

];76 ll an[2][56][38][20][20

];77

//an[i位][p2][p3][p5][p7]

78 ll calc(ll r,ll r1)//

數[0,r],數字積[0,r1]

79103 ll lst=1,now=0

;104 memset(an[now],0,sizeof

(an[now]));

105 an[now][0][0][0][0]=1

;106

for(p=1;p<=g[0];p++)

107119

if(p0

])120

128if(p==g[0

])129

138if(p0]&&!has0[p+1

])139

150}

151return

ans;

152}

153int

main()

154*/

163ll l,r,l1,r1;

164//

scanf("%lld%lld%lld%lld",&l,&r,&l1,&r1);

165 scanf("

%lld%lld%lld

",&r1,&l,&r);

166 r--;l1=1

;167 printf("

%lld

",calc(r,r1)-calc(r,l1-1)-calc(l-1,r1)+calc(l-1,l1-1

));168

return0;

169 }

view code

雙倍經驗:

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