ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1327-A, *1100
    코드포스 2021. 7. 24. 14:21
     

    Problem - 1327A - Codeforces

     

    codeforces.com

    문제

    • $t(1 \leq t \leq 10^{5})$번의 test case 로 구성되어 있다
    • $n(1 \leq n \leq 10 ^{7})$이 서로다른 $k(1 \leq k \leq 10^{7})$개의 홀수 자연수의 합이 될 수 있나? ~ !
    • ! 가 $O(log\ n)$ 정도의 알고리즘이면 통과할 수 있다

     

    $O(t)$

    $k$가 주어졌을 때 ! 가 가능한 $n$들의 집합을 구하자

    서로 다른 $k$개의 홀수 자연수 합의 최소값은
    $$\sum_{i=1}^{k}(2i-1) = k^{2} \Rightarrow n \geq k^{2}$$

    또한,
    $$\mathrm{Sum\ of\ k\ odd\ number} = \left.
      \begin{cases}
        \mathrm{odd}, & \mathrm{k\ is\ odd} \\
        \mathrm{even}, & \mathrm{k\ is\ even}
      \end{cases}
      \right\}$$

    따라서 ! 가 가능한 $n$ 집합은 집합 $S$의 부분집합이다
    $$S=\left \{ n |\ n \geq k^{2}\ \mathrm{and}\ k \equiv n (mod\ 2) \right \}$$

     

    Claim
    ! 가 가능한 $n$ 집합은 $S$와 같다

    $\because$ 서로 다른 $k$개의 홀수 자연수 합이 최솟값인 경우를 보자
    $${1, 3, 5, 7, ... , 2k-1}$$
    이때 $2k-1$을 2씩 증가시켜도, 서로다른 홀수 자연수 집합이다

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <bits/stdc++.h>
    #define endl "\n"
    using namespace std;
    typedef long long ll;
     
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
     
        int t;
        cin >> t;
        ll n, k;
        while(t--){
            cin >> n >> k;
            cout << ((n >= k*&& ((k%2== (n%2)))? "YES""NO"<< endl;
        }
     
     
        return 0;

    '코드포스' 카테고리의 다른 글

    25-A, *1300  (0) 2021.07.24
    467-B, *1100  (0) 2021.07.24
    1335-C, *1100  (0) 2021.07.23
    368-B, *1100  (0) 2021.07.23
    313-B, *1100  (0) 2021.07.23

    댓글

Designed by Tistory.