Hướng dẫn giải của HSG12 Long An 2023 - Vòng 1 - Bài 3

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Tác giả: lds, haruxne

Bài này làm như yêu cầu đề bài. Ta thấy giá trị lớn nhất của tổng bình phương các chữ số là ~9^2 \cdot 16~ vì thế ta dễ dàng dùng mảng để kiểm tra trùng lặp trong ~\mathcal{O}(1)~

Code tham khảo của lds
void input()
{
    cin>>n;
}

long long sumdigit(long long x)
{
    long long sum=0;
    while(x>0)
    {
        sum+=(x%10)*(x%10);
        x/=10;
    }
    return sum;
}

bool check(long long x)
{
    bool dup[9*9*16+1];
    mset(dup,0);
    long long sum=sumdigit(x);
    while(dup[sum]==0)
    {
        dup[sum]=1;
        sum=sumdigit(sum);
        if(sum==1)
            return 1;
    }
    return 0;
}

void lds_go_goooo()
{
    n++;
    while(!check(n))
        n++;
    cout<<n;

}
Code tham khảo của haruxne
ll n;

ll ssdg(string n){
    int sum = 0;
    FOR(i,0,n.size()-1){
        sum += (n[i] - '0')*(n[i] - '0');
    }
    return sum;
}

bool sol(ll n){
    unordered_map<ll,int> f;
    while (ssdg(to_string(n)) != 1){
        n = ssdg(to_string(n)); if (f[n]) return 0; f[n]++;
    }
    return 1;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.