本文共 702 字,大约阅读时间需要 2 分钟。
【题解】
wa了三发才过,我太菜了。思路就是比较普通的思路,就是实现起来比较麻烦(也有点乱嘿嘿嘿)。
思路:把一般情况下每10^i中有多少个带6的数的个数存入c[i],c[1]=1,c[2]=19......显然像60-69,600-699等这种情况比较特殊,我们另外再进行计算。然后从高位到低位依次进行计数,sum加上10^i,i的初值是x的位数,每10^i次ans加上c[i],遇到特殊情况ans就加上10^i。还有一种特殊情况,比如67777或者26333这种,遇到6就直接加上7777或者333并返回,当然这里需要判断。而区间[l,r]之间的满足个数等于[0,r]区间的个数-[0,l-1]区间的个数。
【代码】
typedef long long int ll;const int maxn=1e5+5;const int inf=0x3f3f3f3f;const int mod=1e9+7;ll c[20];ll fun(ll x){ ll c=1; while(x--) c*=10; return c;}int f(ll x){ while(x) { if(x%10==6) return 1; x/=10; } return 0;}ll cul(ll x){ ll cou=0,y=x,ans=0; while(y) { cou++; y/=10; } //printf("cou=%lld\n",cou); y=1; for(ll i=1;i
转载地址:http://yfben.baihongyu.com/