洛谷P3896 [湖南集训]Clever Rabbit(BZOJ3662)

这篇博客介绍了洛谷P3896 [湖南集训]Clever Rabbit的问题,作者对BZOJ3662题目进行了打表法求解,虽然吐槽了打表题目的存在,但提供了枚举隔板位置的高效解决方案,并给出了通过评测的代码。

打表

洛谷题目传送门
BZOJ题目传送门

这套题老师拿给我们考简直有毒

强烈吐槽为什么会有打表这种题目(可能有正解???)

我们可以枚举 g g l也行)在哪个地方分数字,即用9个隔板隔开不同的数字( g g 递减),这样的效率是Cn+99的,跑个大概7分钟表就出来了。

打表代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 35
using namespace std;
int l[N],a[N],b[N],c[N],num[10];
void pd(int n,int p){
    memset(num,0,sizeof(num));
    for (int i=p+1;i<=n;i++) l[i]=0;
    for (int i=1;i<=n;i++)
        b[i]=a[n-i+1]=l[i],num[b[i]]++;
    bool f=false;
    for (int i=1;i<=n;i++){
        c[i]=a[i]-b[i];
        if (c[i]<0) c[i]+=10,a[i+1]--;
        num[c[i]]--; if (c[i]) f=true;
    }
    if (!f) return;
    for (int i=0;i<=9;i++)
        if (num[i]) return;
    for (int i=n;i;i--)
        printf("%d",c[i]);
    puts("");
}
void dfs(int x,int p,int n){
    if (!x) return pd(n,p);
    for (int i=p;i<=n;i++){
        for (int j=p+1;j<=i;j++)
            l[j]=x;
        dfs(x-1,i,n);
    }
}
int main(){
    freopen("1.out","w",stdout);
    for (int i=3;i<=30;i++)
        dfs(9,0,i);
    return 0;
}

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL n,p,ans;
char s[245][35]={
"495",
"6174",
"631764",
"549945",
"63317664",
"97508421",
"864197532",
"554999445",
"6333176664",
"9753086421",
"9975084201",
"86431976532",
"633331766664",
"975330866421",
"997530864201",
"999750842001",
"555499994445",
"8643319766532",
"63333317666664",
"97533308666421",
"97755108844221",
"99753308664201",
"99975308642001",
"99997508420001",
"864333197666532",
"555549999944445",
"6333333176666664",
"9753333086666421",
"9775531088644221",
"9975333086664201",
"9977551088442201",
"9997533086642001",
"9999753086420001",
"9999975084200001",
"86433331976666532",
"98765420987543211",
"633333331766666664",
"975333330866666421",
"977553310886644221",
"997533330866664201",
"997755310886442201",
"886644219977553312",
"999753330866642001",
"999775510884422001",
"999975330866420001",
"999997530864200001",
"555554999999444445",
"999999750842000001",
"8643333319766666532",
"9876543209876543211",
"9987654209875432101",
"63333333317666666664",
"97533333308666666421",
"97755333108866644221",
"97775551108884442221",
"99753333308666664201",
"99775533108866442201",
"88664432199776553312",
"99975333308666642001",
"99977553108864422001",
"99997533308666420001",
"99997755108844220001",
"99999753308664200001",
"99999975308642000001",
"99999997508420000001",
"864333333197666666532",
"987654332098766543211",
"998765432098765432101",
"999876542098754321001",
"555555499999994444445",
"6333333333176666666664",
"9753333333086666666421",
"9775533331088666644221",
"9777555311088864442221",
"9975333333086666664201",
"9977553331088666442201",
"8866443321997766553312",
"9977755511088844422201",
"9997533333086666642001",
"9997755331088664422001",
"9999753333086666420001",
"9999775531088644220001",
"9999975333086664200001",
"9999977551088442200001",
"9999997533086642000001",
"9999999753086420000001",
"9999999975084200000001",
"86433333331976666666532",
"98765433320987666543211",
"98776554210988754432211",
"87765443219997765543222",
"99876543320987665432101",
"99987654320987654321001",
"99998765420987543210001",
"633333333331766666666664",
"975333333330866666666421",
"977553333310886666644221",
"977755533110888664442221",
"997533333330866666664201",
"997755333310886666442201",
"886644333219977666553312",
"997775553110888644422201",
"999753333330866666642001",
"999775533310886664422001",
"999777555110888444222001",
"999975333330866666420001",
"999977553310886644220001",
"999997533330866664200001",
"999997755310886442200001",
"999999753330866642000001",
"999999775510884422000001",
"999999975330866420000001",
"555555549999999944444445",
"999999997530864200000001",
"999999999750842000000001",
"8643333333319766666666532",
"9876543333209876666543211",
"9877655432109887654432211",
"9987654333209876665432101",
"9987765542109887544322101",
"9998765433209876654321001",
"9999876543209876543210001",
"9999987654209875432100001",
"63333333333317666666666664",
"97533333333308666666666421",
"97755333333108866666644221",
"97775553331108886664442221",
"97777555511108888444422221",
"99753333333308666666664201",
"99775533333108866666442201",
"88664433332199776666553312",
"99777555331108886644422201",
"99975333333308666666642001",
"99977553333108866664422001",
"99977755531108886444222001",
"98876654422099877554332111",
"99997533333308666666420001",
"99997755333108866644220001",
"99997775551108884442220001",
"99999753333308666664200001",
"99999775533108866442200001",
"99999975333308666642000001",
"99999977553108864422000001",
"99999997533308666420000001",
"99999997755108844220000001",
"99999999753308664200000001",
"99999999975308642000000001",
"99999999997508420000000001",
"864333333333197666666666532",
"987654333332098766666543211",
"987765543321098876654432211",
"998765433332098766665432101",
"998776554321098876544322101",
"888666444221999777555333112",
"999876543332098766654321001",
"999877655421098875443221001",
"999987654332098766543210001",
"999998765432098765432100001",
"999999876542098754321000001",
"555555554999999999444444445",
"6333333333333176666666666664",
"9753333333333086666666666421",
"9775533333331088666666644221",
"9777555333311088866664442221",
"9777755553111088886444422221",
"9975333333333086666666664201",
"9977553333331088666666442201",
"8866443333321997766666553312",
"9977755533311088866644422201",
"9977775555111088884444222201",
"9997533333333086666666642001",
"9997755333331088666664422001",
"9997775553311088866444222001",
"9887665443220998776554332111",
"9999753333333086666666420001",
"9999775533331088666644220001",
"9999777555311088864442220001",
"9988766544220998775543321101",
"9999975333333086666664200001",
"9999977553331088666442200001",
"9999977755511088844422200001",
"9999997533333086666642000001",
"9999997755331088664422000001",
"9999999753333086666420000001",
"9999999775531088644220000001",
"9999999975333086664200000001",
"9999999977551088442200000001",
"9999999997533086642000000001",
"9999999999753086420000000001",
"9999999999975084200000000001",
"86433333333331976666666666532",
"98765433333320987666666543211",
"98776554333210988766654432211",
"98777655542110988875444322211",
"99876543333320987666665432101",
"99877655433210988766544322101",
"88866644432219997776555333112",
"99987654333320987666654321001",
"99987765543210988765443221001",
"99998765433320987666543210001",
"99998776554210988754432210001",
"99999876543320987665432100001",
"99999987654320987654321000001",
"99999998765420987543210000001",
"633333333333331766666666666664",
"975333333333330866666666666421",
"977553333333310886666666644221",
"977755533333110888666664442221",
"977775555331110888866444422221",
"997533333333330866666666664201",
"997755333333310886666666442201",
"886644333333219977666666553312",
"997775553333110888666644422201",
"997777555531110888864444222201",
"999753333333330866666666642001",
"999775533333310886666664422001",
"999777555333110888666444222001",
"988766544332209987766554332111",
"999777755551110888844442222001",
"999975333333330866666666420001",
"999977553333310886666644220001",
"999977755533110888664442220001",
"998876654432209987765543321101",
"999997533333330866666664200001",
"999997755333310886666442200001",
"999997775553110888644422200001",
"999887665442209987755433211001",
"999999753333330866666642000001",
"999999775533310886664422000001",
"999999777555110888444222000001",
"999999975333330866666420000001",
"999999977553310886644220000001",
"999999997533330866664200000001",
"999999997755310886442200000001",
"999999999753330866642000000001",
"999999999775510884422000000001",
"555555555499999999994444444445",
"999999999975330866420000000001",
"999999999997530864200000000001",
"999999999999750842000000000001"};
int main(){
    scanf("%lld%lld",&n,&p);
    int l=0;
    while (strlen(s[l])<n) l++;
    if (strlen(s[l])!=n) return puts("0"),0;
    while (strlen(s[l])==n){
        unsigned long long x=0;
        for (int i=0;i<n;i++)
            x=(x*10%p+s[l][i]-48)%p;
        ans=(ans+(x*x)%p)%p;
        l++;
    }
    return printf("%lld\n",ans),0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值