oj 数码积和(略难


思路:一开始自己写的代码时间超限了,然后参照了大佬写的代码,构造了三个函数
第一个函数:求数码和的只用循环n次
void is_sum(){for(int i=1;i<N;i++){sum[i]=sum[i/10]+i%10;//递推,sum[i]对应i的数码和}
}第二个函数:求是否是满足数码积性的,有点儿像欧筛,标记1~N所有满足数码积性的数字
void smjx(){for(int x=2;x*x<=N;x++){for(int y=x;x*y<=N;y++){if(sum[x*y]==sum[x]*sum[y]) a[x*y]=1;}}
}第三个函数:前缀和,a[i]表示1~i有多少个满足数码积性的数
void pre(){for(int i=1;i<N;i++){a[i]=a[i]+a[i-1];}
}最后AC代码
#include<stdio.h>
#define N 10000005
int sum[N]={0};
int a[N]={0};
void is_sum(){for(int i=1;i<N;i++){sum[i]=sum[i/10]+i%10;//递推,sum[i]对应i的数码和}
}void smjx(){for(int x=2;x*x<=N;x++){for(int y=x;x*y<=N;y++){if(sum[x*y]==sum[x]*sum[y]) a[x*y]=1;}}
}
void pre(){for(int i=1;i<N;i++){a[i]=a[i]+a[i-1];}
}
int main(){is_sum();smjx();pre();int T;scanf("%d",&T);while(T--){int L,R,cnt=0;scanf("%d %d",&L,&R);printf("%d\n",a[R]-a[L-1]);}}