• 51Nod3016 Prime Path


    Problem

    阿P给阿K出了一个难题,他给阿K两个素数A,B,保证A,B的位数相同且为4位或5位。

    阿K只能对A作一种操作,即将其中一位数字改成另一个数字,要求每次操作后得到的数还是一个素数,问最少多少次可以从A变到B

    Solution

    按每一位bfs

    Code

    #include<stdio.h>
    #include<set>
    #include<iostream>
    #include<stack>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<map>
    #include<queue>
    #include<algorithm>
    typedef long long ll;
    typedef long double ld;
    typedef double db;
    #define io_opt ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    using namespace std;
    const int mod=998244353;
    ll mo(ll a,ll p){
        return a>=p?a%p:a;
    }
    inline int rd() {
        int x = 0, f = 1;
        char ch;
        while (ch < '0' || ch > '9') {
            if (ch == '-')f = -1;
            ch = getchar();
        }
        while (ch >= '0' && ch <= '9') {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
        return f * x;
    }
    inline ll gcd(ll x, ll y){
        return y==0?x:gcd(y,x%y);
    }
    inline ll speed(ll a,ll b){
        ll cur=a,anss=1;
        while(b){
            if(b&1) anss=anss*cur;
            cur=cur*cur;
            b>>=1;
        }
        return anss;
    }
    const int MAXN=1e5;
    bool ipr[MAXN+20];
    int cnt,pri[MAXN/5];
    void prime(){//埃式筛法
        int N=sqrt(MAXN)+0.5,mul;
        memset(ipr,true,sizeof(ipr));
        ipr[1]=false;
        for(int i=2;i<=N;i++){
            if(ipr[i]==true){
                i==2?mul=1:mul=2;
                for(int j=i*i;j<=MAXN;j+=i*mul){
                    ipr[j]=false;
                }
            }
        }
        for(int i=2;i<=MAXN;i++){
            if(ipr[i]==true){
                pri[++cnt]=i;
            }
        }
    }
    int T,a,b;
    int wei(int x){
        int ret=0;
        do{
            x/=10;
            ret++;
        }while(x);
        return ret;
    }
    struct E{
        int num,cnt;
    };
    bool f[100020];
    int bits[10];
    int comb(int t){
        int ret=0;
        for(int i=t;i>=1;i--){
            ret*=10;
            ret+=bits[i];
        }
        return ret;
    }
    int bfs(){
        int t=wei(a);
        queue<E>q;
        q.push((E){a,0});
        f[a]=true;
        while(!q.empty()){
            E cur=q.front();q.pop();
            if(cur.num==b) return cur.cnt;
            for(int i=1;i<=t;i++){
                bits[i]=cur.num%10;
                cur.num/=10;
            }
            //cout<<comb(t)<<endl;
            for(int i=1;i<=t;i++){
                int d=bits[i];
                for(int j=0;j<=9;j++){
                    if(j==d||(i==t&&j==0)) continue;
                    bits[i]=j;
                    int nex=comb(t);
                    //cout<<nex<<endl;
                    if(ipr[nex]&&!f[nex]){
                        f[nex]=true;
                        q.push((E){nex,cur.cnt+1});
                        //cout<<nex<<endl;
                    }
                }
                bits[i]=d;
            }
        }
        return -1;
    }
    int main(){
        io_opt;
        prime();
        cin>>T;
        while(T--){
            memset(f,false,sizeof(f));
            cin>>a>>b;
            if(a==b){
                cout<<0<<endl;
                continue;
            }
            int ans=bfs();
            if(ans==-1){
                cout<<"No solution"<<endl;
            }
            else{
                cout<<ans<<endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    斐波那契数列相关
    社论CF1616G
    题解AGC056
    IOI2018 meetings
    题解UOJ#696. 【候选队互测2022】理论复杂度
    larval5.1模型静态使用多次出现查询属性信息存在问题
    SQL Server里面可能经常会用到的日期格式转换方法
    asp.net页面刷新后样式就发生了改变
    [武汉站]Windows 7 社区发布活动
    C++/CLI学习入门数组
  • 原文地址:https://www.cnblogs.com/sz-wcc/p/13187930.html
Copyright © 2020-2023  润新知