注意到每個數字的質因子只會有2,3,5,7四種,所以分開統計,數字dp
此題卡空間,最好是寫成迴圈,用滾動陣列,我這裡是卡了好久才過去的
1 #include2 #include3 #include4view codeusing
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 }
用迴圈重新寫了一遍
錯誤記錄:沒有判138行"!has0[p+1]",無限wa
1 #include2 #include3 #include4 #include5view codeusing
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 }
雙倍經驗:
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的倍數,不會有其他的質...