打表WA 40分 求调
查看原帖
打表WA 40分 求调
329698
youdu666楼主2022/8/28 16:01

打表机

#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);
}  
2022/8/28 16:01
加载中...