본문 바로가기

코드포스

[코드포스 Practice15] B. Chtholly's request

 

음~ 회문 (뭔지알지)

음 ~ 짝수로? 오케~~

 

회문을 다 찾으라고?? mod로 나누라고???

헉 어렵군 몰겠서 패스 

한 문제였다. 

 

 

 

이것도 어렵게 생각했던 거였는데 간단히 정리하면 반만 생각하면 된다.

 

반이 1부터 100000까지 숫자이고 이걸 대칭으로 붙이면 되니

1 ~ 100000 반복문 -> 숫자를 문자열로 바꿈 -> 문자열을 뒤집어서 붙임 -> 다시 숫자로 바꿔서 sum으로 합친다

 

끝~~

정말 간단한 문제였다....

k까지 회문을 구해서 더하면 되는 문제...

 

이걸 내가 어디서 겁먹었나 생각해보면 (ㅋㅋ 지금 생각하면 좀 웃기다)

 

뭔가 회문 구하는 게 귀납법을 써야할 것 같다! (내가 잘 못쓰는 기법으로 풀 것 같음)

더하는데 mod로 나눈다고? 더할 때 오버플로우 나지 않을까? - 그래서 mod로 나누는 거였다

마지막으로 규칙을 찾으려 했었음ㅋㅋㅋ 더하고 mod 할 때 규칙이 있지 않을까..

 

아무튼 정말 쉬운 문제여서 좀 허망함..

 

#include <iostream>
#include <queue>
#include <string>

using namespace std;
using i64 = long long;

int main() {
    i64 k, p;
    cin >> k >> p;
    
    i64 sum = 0;
    for(int i = 1; i <= k; i++)
    {
        string s = to_string(i);
        string tmp = "";
        for (int j = s.size() - 1; j >= 0; j--)
        {
            tmp += s[j];
        }
        s += tmp;
        sum += (stoll(s) % p);
        sum %= p;
    }
    cout << sum << endl;
    
    
    return (0);
}

 

코드도 쏘 이지.. 간단..

거꾸로 붙이는 걸 어떻게 할지 몰라서 저렇게 했는데 북님 코드 보니 reverse를 쓰면 되겠다 싶다. 

 

#include <iostream>
#include <queue>
#include <string>
#include <algorithm>

using namespace std;
using i64 = long long;

int main() {
    i64 k, p;
    cin >> k >> p;
    
    i64 sum = 0;
    for(int i = 1; i <= k; i++)
    {
        string s = to_string(i);
        string tmp = s;
        reverse(tmp.begin(), tmp.end());
        s += tmp;
        sum += (stoll(s) % p);
        sum %= p;
    }
    cout << sum << endl;
    
    
    return (0);
}

 

 

예아~~