01组成的N的倍数 -同余定理

本文深入探讨了在广度优先搜索(BFS)算法中如何通过维护模运算变量和运用同余定理进行剪枝,以减少大数操作,提高算法效率。特别介绍了在字符串拼接场景下,如何避免重复计算,确保算法快速找到目标解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

  • ①Bfs过程中,在结构体中维护一个字符串a,表示是答案,如果我们每一次都对a整个大数取模操作的话,会增加大量的操作,因为我们每一次都是在字符串末尾加上一位,而且大数取模的过程也是从第一位开始一直向后扫着模的,所以我们这里维护一个变量num,表示当前这个答案a对n的模是多少,那么对应将下一个字符加在最后一位的时候,我们对应维护num=(num*10+0/1)%n即可。
  • ②最关键的剪枝,根据同余定理我们知道,如果对应%n的一个数出现过了,那么接下来我们再继续有一个字符串a%n==这个出现过的数是多余的处理,所以我们对应建立一个vis【i】表示%n==i的字符串我们是否出现过即可。【好棒啊这个剪枝】
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 2000006
    #define ll long long
    bool vis[maxn];
    ll n;
    struct node
    {
        string str;
        ll m;
    } top,temp;
    void bfs()
    {
        queue<node>q;
        temp.str="10";
        temp.m=10%n;
        vis[temp.m]=1;
        q.push(temp);
        temp.str="11";
        temp.m=11%n;
        vis[temp.m]=1;
        q.push(temp);
        while(!q.empty())
        {
            top=q.front();
            q.pop();
            if(top.m==0)
            {
                cout<<top.str<<endl;
                return ;
            }
            temp.str=top.str+'0';
            temp.m=top.m*10+0;
            temp.m%=n;
            if(!vis[temp.m])
            {
                vis[temp.m]=1;
                q.push(temp);
            }
            temp.str=top.str+'1';
            temp.m=top.m*10+1;
            temp.m%=n;
            if(!vis[temp.m])
            {
                vis[temp.m]=1;
                q.push(temp);
            }
        }
    }
    int main()
    {
        while(cin>>n)
        {
            memset(vis,0,sizeof(vis));
            if(n==1)
                cout<<1<<endl;
            bfs();
        }
        return 0;
    }
  •  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值