打表机
#include<cstdio>
#include<cstring>
using namespace std;
inline int read()
{
int x=0,y=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')
y=-1;
c=getchar();
}
while(c<='9'&&c>='0')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*y;
}
const int N=1e9;
inline int qpow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)
ans*=a;
a*=a;
b>>=1;
}
return ans;
}
inline int abs(int x)
{
return x>0?x:~x+1;
}
int a[11],tot,res;
int mgc(int x)
{
tot=res=0;
if(x<10) return x;
while(x)
a[++tot]=x%10,x/=10;
for(int i=1;i<tot;i++)
res+=abs(a[i+1]-a[i])*qpow(10,i-1);
if(res<10) return res;
return mgc(res);
}
inline int min(int a,int b)
{
return a>b?b:a;
}
signed main()
{
freopen("bi.txt","w",stdout);
int len=70000;
for(int i=0;i<=N;i+=len)
{
int l=i,r=min(i+len-1,N),ans=0;
for(int j=l;j<=r;j++)
if(mgc(j)==7)
ans++;
printf("%d,",ans);
}
}
提交代码
#include<cstdio>
#include<bitset>
#include<string>
using namespace std;
const int zc=70000;
const int cnt[16054]=
{};
inline int l(int x)
{
return (x-1)*zc+1;
}
inline int r(int x)
{
return x*zc;
}
inline int q(int x)
{
return (x+zc-1)/zc;
}
inline int read()
{
int x=0,y=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')
y=-1;
c=getchar();
}
while(c<='9'&&c>='0')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*y;
}
inline int qpow(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)
ans*=a;
a*=a;
b>>=1;
}
return ans;
}
inline int abs(int x)
{
return x>0?x:~x+1;
}
int a[11],tot,res;
int mgc(int x)
{
tot=res=0;
if(x<10) return x;
while(x)
a[++tot]=x%10,x/=10;
for(int i=1;i<tot;i++)
res+=abs(a[i+1]-a[i])*qpow(10,i-1);
if(res<10) return res;
return mgc(res);
}
int ans;
signed main()
{
int x=read(),y=read();
int qx=q(x),qy=q(y);
if(qx==qy)
{
// printf("H");
for(int j=x;j<=y;j++)
ans+=(mgc(j)==7);
printf("%d\n",ans);
return 0;
}
for(int i=x;i<=r(qx);i++)
ans+=(mgc(i)==7);
for(int i=l(qy);i<=y;i++)
ans+=(mgc(i)==7);
for(int i=qx+1;i<=qy-1;i++)
ans+=cnt[i];
printf("%d\n",ans);
}