Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Ruff! Ruff!

#[C++] 2331 - 반복수열 본문

백준

#[C++] 2331 - 반복수열

maeng-kim 2024. 2. 27. 14:52

https://www.acmicpc.net/problem/2331

 

2331번: 반복수열

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.

www.acmicpc.net


문제

다음과 같이 정의된 수열이 있다.

  • D[1] = A
  • D[n] = D[n-1]의 각 자리의 숫자를 P번 곱한 수들의 합

예를 들어 A=57, P=2일 때, 수열 D는 [57, 74(=52+72=25+49), 65, 61, 37, 58, 89, 145, 42, 20, 4, 16, 37, …]이 된다. 그 뒤에는 앞서 나온 수들(57부터가 아니라 58부터)이 반복된다.

이와 같은 수열을 계속 구하다 보면 언젠가 이와 같은 반복수열이 된다. 이때, 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 구하는 프로그램을 작성하시오. 위의 예에서는 [57, 74, 65, 61]의 네 개의 수가 남게 된다.

입력

첫째 줄에 A(1 ≤ A ≤ 9999), P(1 ≤ P ≤ 5)가 주어진다.

출력

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.


using namespace std;
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>

int A, p;
vector<int> list;

int cn(int b) {
    int a=b%10;
    A /= 10;
    return a;
}

int dn(int n) {
    int sum =0;
    int tmp = n;
    while(tmp > 0) {
        sum += pow(cn(tmp), p);
        tmp /= 10;
    }
    
    return sum;
 }
 
int main()
{
    cin >> A >> p;
    
    int current = A;
    
    while(true) {
        if(find(list.begin(), list.end(), current)!= list.end()) {
            //index = find(list.begin(),list.end(), current) - list.begin();
            break;
        }
        list.push_back(current);
        current = dn(current);
    }
    int index=0;
    index = find(list.begin(), list.end(), current) - list.begin();
    
    int cnt=0;
    for(int i=0; i< index; ++i) {
        cnt++;
    }
    cout << cnt;
    

    return 0;
}

'백준' 카테고리의 다른 글

#[C++] 11722 - 2×n 타일링 2  (0) 2024.07.04
#[C++] 11726 - 2×n 타일링  (0) 2024.07.03
#[C++]2875 - 대회or인턴  (0) 2024.02.21
#[C++]1181 - 단어정렬  (0) 2024.02.21
#[C++]10814 - 나이순 정렬  (0) 2024.02.21