HDU1579 beautiful number
题目贴上来有点问题。。。。就贴个数据把
Sample Input
2 1 11 999999993 999999999
Sample Output
10 2
题意:问你 [L,R] 区间里的数符合 前位大于后卫,且每个前位都能被任何一个后卫数整除 的数的个数。
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define LL long long
int dp[15][15];
int cal(int cc)
{
if(cc == 0)return 0;
int v[15],cnt(1);
while(cc)
{
v[cnt++] = cc % 10;
cc /= 10;
}
cnt--;//数的位数
LL ans = 0;
for(int i=1; i<cnt; i++)//小一位都先加上如1476先加上999内的。。。。
for(int j=1; j<=9; j++)
{
ans += dp[i][j];
}
int i, pre = -1;
for(i=cnt; i>0; i--)
{
for(int j=1; j<v[i]; j++)
{
if(pre == -1 || pre % j == 0)
ans += dp[i][j];
}
if(pre == -1) pre = v[i];
else
{
if(v[i] == 0 || pre % v[i] != 0)break;
else
pre = v[i];
}
}
if(i <= 0)ans++;//本身是一个
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
for(int i=1; i<=9; i++)
dp[1][i] = 1;
for(int i=2; i<=10; i++)
for(int j=1; j<=9; j++)
for(int k=1; k<=9; k++)
{
if(k % j == 0)
dp[i][k] += dp[i-1][j];
}
int t, L, R;
cin >> t;
while(t--)
{
scanf("%d%d",&L,&R);
cout << cal(R)-cal(L-1)<<endl;
}
}
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define LL long long
int dp[15][15];
int cal(int cc)
{
if(cc == 0)return 0;
int v[15],cnt(1);
while(cc)
{
v[cnt++] = cc % 10;
cc /= 10;
}
cnt--;//数的位数
LL ans = 0;
for(int i=1; i<cnt; i++)//小一位都先加上如1476先加上999内的。。。。
for(int j=1; j<=9; j++)
{
ans += dp[i][j];
}
int i, pre = -1;
for(i=cnt; i>0; i--)
{
for(int j=1; j<v[i]; j++)
{
if(pre == -1 || pre % j == 0)
ans += dp[i][j];
}
if(pre == -1) pre = v[i];
else
{
if(v[i] == 0 || pre % v[i] != 0)break;
else
pre = v[i];
}
}
if(i <= 0)ans++;//本身是一个
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
for(int i=1; i<=9; i++)
dp[1][i] = 1;
for(int i=2; i<=10; i++)
for(int j=1; j<=9; j++)
for(int k=1; k<=9; k++)
{
if(k % j == 0)
dp[i][k] += dp[i-1][j];
}
int t, L, R;
cin >> t;
while(t--)
{
scanf("%d%d",&L,&R);
cout << cal(R)-cal(L-1)<<endl;
}
}
风格不错的代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int DIT = 15;
const int MAXD = 15;
int f[MAXD][DIT], a[MAXD];
void prework()
{
for (int i = 1; i <= 9; ++i) f[1][i] = 1;
for (int i = 2; i <= 10; ++i) {
for (int j = 1; j <= 9; ++j) {
for (int l = 1; l <= j; ++l) {
if (j % l == 0) {
f[i][j] += f[i-1][l];
}
}
}
}
}
int low(int d)
{
int res = 0;
for (int i = 1; i < d; ++i) {
for (int j = 1; j <= 9; ++j) {
res += f[i][j];
}
}
return res;
}
int calc(int x, int d)
{
int res = 0;
for (int i = 1; i < a[d]; ++i) {
res += f[d][i];
}
while (d) {
if (a[d-1] > a[d]) {
res += f[d][a[d]];
return res;
}
for (int i = 1; i < a[d-1]; ++i) {
if (a[d] % i == 0) {
res += f[d-1][i];
}
}
if (a[d-1] == 0 || a[d] % a[d-1] != 0) return res;
--d;
}
return res+1;
}
int work(int x)
{
if (x < 10) return x;
int d = 0;
while (x) {
a[++d] = x%10;
x /= 10;
}
int res = low(d);
res += calc(x, d);
return res;
}
int main()
{
int T;
scanf("%d", &T);
prework();
a[0] = 1;
while (T--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", work(r) - work(l-1));
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int DIT = 15;
const int MAXD = 15;
int f[MAXD][DIT], a[MAXD];
void prework()
{
for (int i = 1; i <= 9; ++i) f[1][i] = 1;
for (int i = 2; i <= 10; ++i) {
for (int j = 1; j <= 9; ++j) {
for (int l = 1; l <= j; ++l) {
if (j % l == 0) {
f[i][j] += f[i-1][l];
}
}
}
}
}
int low(int d)
{
int res = 0;
for (int i = 1; i < d; ++i) {
for (int j = 1; j <= 9; ++j) {
res += f[i][j];
}
}
return res;
}
int calc(int x, int d)
{
int res = 0;
for (int i = 1; i < a[d]; ++i) {
res += f[d][i];
}
while (d) {
if (a[d-1] > a[d]) {
res += f[d][a[d]];
return res;
}
for (int i = 1; i < a[d-1]; ++i) {
if (a[d] % i == 0) {
res += f[d-1][i];
}
}
if (a[d-1] == 0 || a[d] % a[d-1] != 0) return res;
--d;
}
return res+1;
}
int work(int x)
{
if (x < 10) return x;
int d = 0;
while (x) {
a[++d] = x%10;
x /= 10;
}
int res = low(d);
res += calc(x, d);
return res;
}
int main()
{
int T;
scanf("%d", &T);
prework();
a[0] = 1;
while (T--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", work(r) - work(l-1));
}
return 0;
}

浙公网安备 33010602011771号