数7
标签:已使用前缀和、预处理优化
时间限制: 3s
描述
求整数序列中位置L到位置R中一共有多少个7。对于每个数7的个数的定义为,十进制各个位置上一共有多少个7,以及能够被7整除的次数。
输入
第一行是一个整数T,代表测试数据的组数。每组数据中两个整数L,R。其中T≤50,L<R<10^5。
输出
共T行,共有多少个7。
样例输入
2
1 10
47 50
样例输出
2
3
提示
第一组样例中1到10中,只有7被计数,它十进制下有7并且是7的倍数,所以被计数2次。第二组样例中47有1个7,49可以被7整除2次,所以共被计数3次。
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int init()
{//已用前缀和优化
int i,j,k,x;
memset(a,0,10005);
for(i=6;i<=10000;i++)
{
k=i;
while(k)
{
if(k%7==0)
{
a[i]++;
k=k/7;
}
else
break;
}
j=i;
while(j)
{
x=j%10;
if(x==7)
a[i]++;
j=j/10;
}
// printf("a[%d]==%d\n",i,a[i]);
a[i]=a[i]+a[i-1];
}
return 0;
}
int main()
{
int i,j,l,r,t,s;
init();
scanf("%d",&t);
for(i=0;i<t;i++)
{
s=0;
scanf("%d%d",&l,&r);
for(j=l-1;j<=r;j++)
{
// s=s+a[l];
printf("a[%d]==%d\n",j,a[j]);
}
printf("%d\n",a[r]-a[l-1]);
}
return 0;
}