天梯赛 L2-029 特立独行的幸福

  • Post author:
  • Post category:其他


思路:对[l,r]区间的数进行两次遍历,第一次遍历对每个数找依附于它的幸福数,将这些数标记,第二次遍历找所有未被标记的数,判断其是否是幸福数,并找出依附于它的数的个数作为其独立性,若该数为素数,独立性翻倍,这个过程我通过dfs来完成

代码:

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const ll maxn=1e4+9;
ll flag=0,cnt=0,ans,tar;
ll vis[maxn],mp[maxn],prime[maxn],book[maxn];
set<ll>st;
ll l,r;
void solve(ll v){
    ll sum=0,u=v;
    if(v==1){
        flag=1;
        return;
    }
    while(u){
        sum+=(u%10)*(u%10);
        u/=10;
    }
    if(vis[sum])return;
    vis[sum]=1;
    solve(sum);
    vis[sum]=0;
    if(flag){
        if(v!=tar&&v<=r&&v>=l)
        st.insert(v);
    }
    return;
}
void to_pr(){
    for(ll i=2;i<=maxn;i++){
        if(!book[i])prime[i]=1;
        for(ll j=i*i;j<=maxn;j+=i){
            book[j]=1;
        }
    }
}
void to_answer(ll v){
    ll sum=0,u=v;
    if(v==1){
        flag=1;
        ans=cnt;
        return;
    }
    while(u){
        sum+=(u%10)*(u%10);
        u/=10;
    }
    if(vis[sum])return;
    vis[sum]=1;
    cnt++;
    to_answer(sum);
    cnt--;
    vis[sum]=0;
    return ;
}
int main(){
    to_pr();
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll i,j,k,n;
    cin>>l>>r;
    for(ll i=l;i<=r;i++){
        flag=0;tar=i;
        solve(i);
    }
    for(auto it:st){
        mp[it]=1;
    }
    int ff=0;
    for(i=l;i<=r;i++){
        flag=0;
        if(!mp[i]){
            to_answer(i);
            if(flag){ff=1;
                if(prime[i])ans*=2;
                cout<<i<<' '<<ans<<endl;
            }
        }
    }
    if(!ff)cout<<"SAD"<<endl;
}



版权声明:本文为K_R_forever原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。