natalina's blog

By natalina, 11 months ago, translation, In English

1846A - Rudolph and Cut the Rope

Author: Sasha0738

Hint 1
Hint 2
Tutorial
Solution
Rate the problem

1846B - Rudolph and Tic-Tac-Toe

Author: Sasha0738

Hint 1
Tutorial
Solution
Rate the problem

1846C - Rudolf and the Another Competition

Author: vladmart

Hint 1
Hint 2
Tutorial
Solution
Rate the problem

1846D - Rudolph and Christmas Tree

Author: vladmart

Hint 1
Hint 2
Hint 3
Tutorial
Solution
Rate the problem

1846E1 - Rudolf and Snowflakes (simple version)

Author: natalina

Hint 1
Hint 2
Hint 3
Tutorial
Solution
Rate the problem

1846E2 - Rudolf and Snowflakes (hard version)

Author: natalina

Hint 1
Hint 2
Hint 3
Hint 4
Tutorial
Solution
Rate the problem

1846F - Rudolph and Mimic

Author: Sasha0738

Hint 1
Hint 2
Tutorial
Solution
Rate the problem

1846G - Rudolf and CodeVid-23

Author: vladmart

Hint 1
Hint 2
Hint 3
Tutorial
Solution
Rate the problem
  • Vote: I like it
  • +15
  • Vote: I do not like it

»
11 months ago, # |
  Vote: I like it +13 Vote: I do not like it

HacksForces

»
11 months ago, # |
Rev. 3   Vote: I like it +3 Vote: I do not like it

For E2 there is a simpler solution to check if there exists a $$$k$$$ such that $$$1 + k + k ^2 = n$$$.

You can rearrange the equation to $$$k(k + 1) = n - 1$$$. It follows that the only $$$k$$$'s you need to check are $$$\lfloor \sqrt{n - 1}\rfloor$$$ and $$$\lfloor \sqrt{n - 1}\rfloor - 1$$$. This is a modified version of the official solution : code

EDIT : as davi-v pointed out,there is no need to check for $$$\lfloor \sqrt{n - 1}\rfloor - 1$$$.

  • »
    »
    11 months ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    Great!

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    can you explain why are checking the equation for k=2 and why we only floor(sqrt(n — 1)) and floor(sqrt(n — 1)) — 1 ?

    • »
      »
      »
      11 months ago, # ^ |
        Vote: I like it +1 Vote: I do not like it

      Sure! I assume you meant $$$exponent = 2$$$,not $$$k = 2$$$. If you deal with all $$$k$$$ $$$<=$$$ $$$10 ^ {6}$$$ (for example by precalculating a set of valid numbers),for all other $$$k$$$ $$$>$$$ $$$10 ^ {6}$$$ the exponent must be exactly $$$2$$$. That is because the minimmum exponent is $$$2$$$ and if the exponent was $$$3$$$ the sum would be larger than $$$10 ^{18}$$$.Now we have to check that there exists a $$$k$$$ such that $$$1 + k + k ^2 = n$$$. This is the same as checking if there is a $$$k$$$ such that $$$k(k + 1) = n - 1$$$. Now, let $$$r = \sqrt{n - 1}$$$. It is easy to see that $$$k < r$$$. However, $$$k$$$ must be as large as possible so $$$k$$$ is either $$$\lfloor r \rfloor$$$ or $$$\lfloor r \rfloor - 1$$$ when $$$n - 1$$$ is a perfect square.

      • »
        »
        »
        »
        11 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        I want to say like for p=2 the equation would be 1+k+k^2. So why we have taken for p=2 if the no. Is not found in precalculated array.

        • »
          »
          »
          »
          »
          11 months ago, # ^ |
            Vote: I like it 0 Vote: I do not like it

          Because for n <= 1018 and p = 2 the value of k could be approximately sqrt(n) = 109. But we can precalc values only for k <= 106

          • »
            »
            »
            »
            »
            »
            11 months ago, # ^ |
              Vote: I like it 0 Vote: I do not like it

            1+k+k^2=n how do we get to this ?

            • »
              »
              »
              »
              »
              »
              »
              11 months ago, # ^ |
                Vote: I like it 0 Vote: I do not like it

              This is formula for the number of vertexes in minimal snowflake. 1 vertex at the initial value, k vertexes at the second layer and k^2 vertexes at the third one.

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        انا

  • »
    »
    11 months ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    Very inefficient approach. It can be done with binary search sir !!!

    • »
      »
      »
      11 months ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      I did think about BS in the cts, but I couldn't go with that, can you tell me that solution ?

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    can u explain "if (p > (long long)(1e18) / k) break;" Why this statement is necessary?

    • »
      »
      »
      10 months ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      The if statement is necessary because otherwise the sum could overflow. If you have to check if $$$a \cdot b > val$$$ , a neat way of doing this and avoiding overflow is checking if $$$a > val / b$$$. Hope this helps!

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it +1 Vote: I do not like it

        Thank u for your reply, i got it:)

  • »
    »
    10 months ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    You don't need to check $$$\lfloor{\sqrt{n-1}}\rfloor - 1$$$. Let $$$m = n - 1$$$. For $$$k(k+1)=k^2+k$$$ to be $$$m$$$, $$$k < \sqrt{m}$$$. Let $$$x = \lfloor\sqrt{m}\rfloor$$$. The question is: which numbers of the form $$$k=x-c$$$, $$$c \ge 0$$$ do we need to check?

    Substituting in $$$k(k+1)$$$, we get $$$(x-c)(x-c+1)=x^2+x(-2c+1)+c^2-c$$$. Note that $$$x(-2c+1)+c^2-c$$$ must be $$$\ge 0$$$, as $$$x^2 \le m$$$. We need to show that if $$$c > 0$$$, $$$x(-2c+1)+c^2-c < 0$$$, so $$$x^2+x(-2c+1)+c^2-c$$$ can't equal $$$m$$$.

    Note $$$c \le x$$$, otherwise $$$k$$$ would be negative. Let $$$x = c + d, d \ge 0$$$. Substituting, we get

    $$$ x(-2c+1)+c^2-c = (c+d)(-2c+1)+c^2-c\\ =-2c^2+c-2cd+d+c^2-c=-c^2-2cd+d. $$$

    If $$$c > 0$$$, $$$-c^2-2cd+d=-c^2+d(-2c+1) < 0$$$, as $$$-c^2 < 0$$$ and $$$-2c+1 \le 0$$$.

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      You are correct! Thank you for pointing out my mistake, I will make sure to correct it shortly. Also, I found a simpler proof to prove we don't need to check $$$ \lfloor \sqrt{n - 1}\rfloor$$$ :

      I claim that for any number $$$a = k ^ {2},k\in\mathbb{N},\nexists b \in \mathbb{N}$$$ such that $$$b \cdot (b + 1) = a$$$. When $$$b = k,b \cdot(b + 1) > a$$$ and when $$$b <= k - 1,b \cdot(b + 1) < a$$$. Because $$$b \cdot(b + 1)$$$ is either $$$>$$$ or $$$<$$$ than $$$a$$$,we can conclude that $$$b \cdot(b + 1) \neq a$$$.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

E2 is a superb binary search question, liked it

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I did think about BS in the cts, but I couldn't go with that, can you tell me that solution ?

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      If you still haven't got the idea a more simpler bs solution is consider 1+k+k^2+..k^p, observe that this is less than k^(p+1) and as well observe that the maximum value of p can be 63 since any power greater than p and the sum>1e18, so from here we can bruteforce for all powers and for this power we can upper bound the value of k by n^(1/p), and binary search which value of k satisfies 1+k+...k^p==n, if any confusion feel free to ask.

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Can you please explain the concept of n^(1/p). I am not getting this part.

        • »
          »
          »
          »
          »
          10 months ago, # ^ |
            Vote: I like it +1 Vote: I do not like it

          So if it's something like if 1+k+k^2+..+k^p=n then k^(p+1)>n, you can easily deduce that I think(correlate it with binary recall that bit set at position i is bigger than all combined from i-1 to 1), so from k^(p+1)>n, we get got any k greater than n^(1/(p+1)) we definitely can't get the answer so that is the upper bound, hope it helps.

»
11 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Hi, can anyone help me debug my submission for E2? Don't know why I am getting WA.Thanks in advance.212818653

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I don't know why I can't pass test9 :(((

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I tried the similar approach in python (no overflow) and got WA on tc 16 after increasing the max value upto 1e25... (was AC initially and finally got hacked :(( )

    Further increment gave TLE... maybe the constraints weren't designed for the binary search solution... (unless I'm wrong, in which case I would appreciate if someone pls provided me with an AC solution)

    P.S: My initial approach in C++ was returning LLONG_MAX in the binpow function whenever overflow occured (used a check_overflow() function...) which gave WA on tc 5... Idk why...

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

why is the D in editorial AC without setprecision? what differs from my submission . ik i messed up the setprecision in my code but still why

  • »
    »
    11 months ago, # ^ |
      Vote: I like it +8 Vote: I do not like it

    Precision is set before the solution code at the beginning of the main function

»
11 months ago, # |
  Vote: I like it -16 Vote: I do not like it

At the time of contest 1846C is accepted so I have done 4th but next day it is showing wrong on test case 10. it's your fault not mine.

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    it's your fault

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      It's plateform fault because it is showing correct how can I know it fails on some test case

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        After contests end more tests are added

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        From the announcement: "The round will be hosted by rules of educational rounds (extended ICPC). Thus, solutions will be judged on preliminary tests during the round, and after the round, it will be a 12-hour phase of open hacks."

        This is part of typical D3 rounds: you will not know whether your solution passes all tests during the contests, and this challenges you to think carefully about special and corner cases and thus helps to improve your skills.

»
11 months ago, # |
Rev. 6   Vote: I like it +23 Vote: I do not like it

For E2, there is a much simpler code arising from the result of an inequality.

We can just iterate through the values of p. For each p, we need to check for only a single value of k which is floor(n^(1/j)). This is the only possible value of k that may satisfy the condition for a given value of p. This is because:

k^p < 1+k+(k^2)+....+(k^p) < (1+k)^p implies k < (1+k+(k^2)+....+(k^p))^(1/p) < 1+k

If n is equal to 1+k+(k^2)+....+(k^p), then k should be less than n^(1/p) and as per the above inequality k should be floor(n^(1/p)).

Here's the code.

#include <bits/stdc++.h>
using namespace std;

long long int sumpow(long long int x, int y) {
    long long int p=1;
    for(int i=1;i<=y;i++) {
        p=1+x*p;
    }
    return p;
}

int main() {
    int t;
    cin>>t;
    for(int i=1;i<=t;i++) {
        long long int n;
        cin>>n;
        int decider=0;
        for(long double j=2;j<(log(n)/log(2));j++) {
            long long int c=powl(n,1/j);
            if(sumpow(c,j)==n) {
                decider=1;
                cout<<"YES"<<endl;
                break;
            }
        }
        if(decider==0) {
            cout<<"NO"<<endl;
        }
    }
    return 0;
}
»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

e2 is yituodabian

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

So we can take one medicine multiple times in G?

  • »
    »
    11 months ago, # ^ |
    Rev. 9   Vote: I like it +20 Vote: I do not like it

    It doesn't matter if it's allowed or not since it would never actually be useful to take the same medicine multiple times anyway.

    I claim that if there is a sequecne of medicine that removes all symptoms and medicine $$$x$$$ is used multiple times, we can keep the last occurrence of $$$x$$$ and remove all earlier ones, and the sequence stays valid.

    Proof: Consider the symptoms medicine $$$x$$$ cures. It doesn't matter if these symptoms are cured or not before the last occurrence of $$$x$$$ since the last time of taking medicine $$$x$$$ cures these symptoms anyway. Thus, taking medicine $$$x$$$ also earlier has no effect.

    Now consider the symptoms medicine $$$x$$$ gives. It doesn't matter if these symptoms are cured or not before the last occurrence of $$$x$$$ since taking this medicine will give these symptoms anyways, and they need to be cured later. Thus, taking medicine $$$x$$$ also earlier has no effect.

    This means that taking medicine $$$x$$$ also earlier than the last occurrence has no effect on any symptoms. $$$\square$$$

»
11 months ago, # |
  Vote: I like it +4 Vote: I do not like it

this round has really weak testcases. It's not only for B and C, but also for G. This is my submission for G, in no way should it pass but still it passes.

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Your solution is fine (why I don't know), check the announcement page someone explained why this works

    • »
      »
      »
      11 months ago, # ^ |
      Rev. 2   Vote: I like it 0 Vote: I do not like it

      ummm... the solution takes at most 20 medicine.

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        Yes, but your solution is still correct. It can be shown that we never need more than 10 medicine to get fully cured, here is a short explanation (without proof). I can provide a proof if you can't see why that is true.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I failed five times on E2. But G is a piece of cake,because UVA658 is quite similar to it.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

My Solution Pretty sure , I have the same solution as that of the editorial . Dunno why I got the TLE though

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Any idea why this submission is giving a WA for D? I have just subtracted the overlapping area instead of using the trapezium formula.`

https://mirror.codeforces.com/contest/1846/submission/212715188

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    setprecision() goes before output we set precicion for

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

In problem G, what if Rudolf cannot transition from the initial state to a specific state using a particular medicine, but can still alleviate symptoms one by one?

»
11 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

1846-C - Rudolf and the Another Competition

Any idea why my submission gets a TLE here. Time complexity is O(n*mlogm). 212937677

Spoiler
»
11 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

can python sqeeze through C and D without TLE?

here's my code and they seem to not work even tho the complexity is exactly identical to the editorial

https://mirror.codeforces.com/contest/1846/submission/212613024 (C)

https://mirror.codeforces.com/contest/1846/submission/212645926 (D)

an explanation or help would be wonderful.

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    For D you can see my submission here 212968791 (I just change your code a little and get accepted)

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      thanks man. Apparently storing it in an array doesn't work as fast as I thought

  • »
    »
    11 months ago, # ^ |
    Rev. 3   Vote: I like it 0 Vote: I do not like it

    Del.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

My solution in B does not require a review of 4 cases.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

well , i am still a beginner, but in problem 3 ... i don't get how did we store the solution times for each student by this :

for(int i = 0; i < n; i++){ vector cur(m); for(int j = 0; j < m; j++){ cin >> cur[j]; }

while this should only store the last student only since it overwrites the existing values in each new outer loop ?

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    You're correct; this only stores the solution times for the last student. But notice that right after reading this, we already handle this student by calculating the optimal number of problems and minimum time penalty for this student. Thus, we don't need to store the problem-specific times for any longer and they can be overwtitten by new data.

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it
      if (i){
           if (make_pair(-task_cnt, penalty) < rud) ans++;
      } else rud = {-task_cnt, penalty};
      
      

      how does this work in C solution given in the editorial?

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        make_pair(-task_cnt, penalty) is used to create a pair with two values: -task_cnt and penalty. The negative sign before task_cnt is used to ensure that when comparing pairs, the pair with a smaller task_cnt value takes higher priority. If the -task_cnt is equal for two pairs, the comparison will be based on the penalty value. This pair is used for comparison in the following line:

»
11 months ago, # |
  Vote: I like it -8 Vote: I do not like it

212951522 For problem F, why does this code give Idleness Limit Exceeded

  • »
    »
    11 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    You output mimic position before reading full response from OJ

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

In E2, can somebody tell me the value of k that satisfy 29th test case i.e. n = 64000160000400001, I think this test case is wrong.

»
11 months ago, # |
  Vote: I like it +9 Vote: I do not like it

Dial's algorithm can be used in G to achieve $$$O(2^n \cdot (m + MAXd))$$$ complexity. 212963777

  • »
    »
    10 months ago, # ^ |
      Vote: I like it -8 Vote: I do not like it

    Cuz the range of weight of a edge is 10^3(d) and there is 1024 vertices at max, so Dial's algorithm work fine but not more effective than Dijkstra's algorithm with STD in C++.

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Amazing problemset. Anyone easily can hacks.(hahaha)

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I did think about BS at E2 in the cts, but I couldn't go with that, someone please tell me the editorial of that solution, I really need it. Thank you.

  • »
    »
    11 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    Assume that we have an array {$$$a_k$$$} satisfied $$$a_k = k^2+k+1$$$ , then we can see $$${a_k}$$$ is increasing when k increases. So BS works on this array. We can use BS to check whether the given $$$n$$$ is in {$$$a_k$$$}.Pick $$$l$$$=2 and $$$r$$$=minimum $$$k$$$ satisfied $$$a_k > 10^{18}$$$ and BS.Then we can check $$$b_k = k^3+k^2+k+1 $$$ , $$$c_k = k^4+k^3+k^2+k+1 $$$ ... till $$$A_k = k^{63}+k^{62}+...+k+1$$$ .If the given $$$n$$$ doesn't stay in the arrays mentioned above , the answer is "NO".

    You don't really need to construct these arrays and store the value of them (MLE) , just calculate $$$a_{mid}$$$ and compare $$$a_{mid}$$$ with the given $$$n$$$ .

»
11 months ago, # |
  Vote: I like it +5 Vote: I do not like it

In problem G, you should have mentioned that you can use a medicine several times because without it the problem seems quite complicated. By the way, does anyone know if it's possible to solve the problem if we can use each medicine only once?

  • »
    »
    11 months ago, # ^ |
    Rev. 2   Vote: I like it +8 Vote: I do not like it

    this is my submission for this problem submission. When we use one medicine at a time then we just have to make the following change in the code

            for (int i = 0; i < m; ++i) {
                for (int mask = 0; mask < 1 << 10; ++mask) {
                // cost[mask] = cost for getting this much protection
                    if ((damage[i] & mask) == damage[i]) {
                        minSelf(cost[save[i] | mask], cost[mask] + days[i]);
                    }
                }
            }
    
    

    I just swapped the two loops of dp just like we do in coin change dp problem.

  • »
    »
    11 months ago, # ^ |
      Vote: I like it +8 Vote: I do not like it
»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

For problem E? How do we obtain the maximum possible value for k

»
11 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Try to solve E2 with binary search, Don't know what I've missed

https://mirror.codeforces.com/contest/1846/submission/212862518

»
10 months ago, # |
Rev. 4   Vote: I like it 0 Vote: I do not like it

this solution is accepted in e1 but not in e2,provide me some reason, let n=1+x+x^2......+x^i ------ eq(1) now, we know, x^i<n<(x+1)^i (by binomal theorm) that, means x<n^(1/i)<x+1, now x can be gif(n^(1/i)), we will satisfy eq(1) with x, if it is true ans exist. we will do it for i between 2 to 61.

  • »
    »
    10 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    Hey your solution is too slow, the bound for the largest power is incorrect as well, check for i<=63, since 2^63~1e18, it will still tle with the current solution though, check this for an alternate approach my approach

    • »
      »
      »
      10 months ago, # ^ |
      Rev. 4   Vote: I like it 0 Vote: I do not like it

      it would be 60, and now it's tle, but complexity for each case woould be logn*logn*60

      • »
        »
        »
        »
        10 months ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        By your approach right, mine is a simple binary search that's just logn*63

        • »
          »
          »
          »
          »
          10 months ago, # ^ |
            Vote: I like it 0 Vote: I do not like it

          my solution is giving tle now :(

        • »
          »
          »
          »
          »
          10 months ago, # ^ |
            Vote: I like it 0 Vote: I do not like it

          your apporach is logn*logn*60 too

          • »
            »
            »
            »
            »
            »
            10 months ago, # ^ |
            Rev. 2   Vote: I like it 0 Vote: I do not like it

            How is this 212715312 logn*logn*60?

            • »
              »
              »
              »
              »
              »
              »
              10 months ago, # ^ |
                Vote: I like it 0 Vote: I do not like it

              leave it i have used inbuilt pow function in python

            • »
              »
              »
              »
              »
              »
              »
              10 months ago, # ^ |
                Vote: I like it 0 Vote: I do not like it
              import sys
              input=sys.stdin.readline        
              for _ in range(int(input())):
                  n=int(input())
                  for i in range(2,61):
                      a=int(n**(1/i))
                      if a==1:
                          print("NO")
                          break
                      c=1
                      ae=0
                      t=0
                      while ae<n:
                          ae+=c
                          c=c*a
                          t+=1
                      if ae==n and t>2:
                          print("YES")
                          break
                  else:
                      print("NO")
              
»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Oooh, F was sooo easy, why I didn't read it during the contest:(

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I'm not sure about this, but for E1 (and maybe E2 for some $$$n$$$ not too large), since $$$n = 1 + k + k^2 + k^3 + \dots$$$, we would have $$$k$$$ be a divisor $$$(n - 1)$$$, and we can iterate all such k, noting that for some integer $$$p \geq 2$$$ (if it exists):

$$$ n = 1 + k + k^2 + k^3 + ... + k^p \\ \rightarrow n = \frac{k^{p + 1} - 1}{k - 1} \\ \rightarrow k^{p + 1} = n(k - 1) + 1 \\ \rightarrow p = log_k{(n(k - 1) + 1)} - 1$$$

We only need to check if $log_k{(n(k - 1) + 1)} - 1$ is an integer and if it is larger to equal to $$$2$$$ using repeated division, since the float log function can be expensive:

int t = 0; //we use this variable as a switch to check 

(iterate over all divisors k of n-1){
    int a =  n*(k - 1) + 1;
    int x = 0; (since we need p >= 2, x >= 3
    while (a % k == 0) {
        a /= k; x++; //we need x to count the exponent, which is p
    }
    x -= 1;
    if (a == 1 && x >= 2 ) t = 1; break; //if we reach here we can finish early
}
if (t == 1) cout << "YES";
else cout << "NO";
»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it
if (i){
     if (make_pair(-task_cnt, penalty) < rud) ans++;
} else rud = {-task_cnt, penalty};

how does this work in C solution given in the editorial?

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

有人吗

»
10 months ago, # |
Rev. 3   Vote: I like it 0 Vote: I do not like it

为什么使用等比数列预处理会WA?

#include <bits/stdc++.h>

#define int long long

using namespace std;

unordered_map <int, int> mp;
int n;

signed main() {
	
	// n == (k^(t+1) - 1) / (k - 1),等比数列
	// 下边生成在t >= 3时的所有n值
	for (int k = 2; k <= 1000100; k ++) {
		for (int t = 3; ; t ++) {
			if ((pow(k, t + 1) - 1) / (k - 1) > 1e18)
				break;
			__int128 fz = pow(k, t + 1) - 1;
			__int128 fm = k - 1;
			if (fz % fm == 0) {
				mp[fz / fm] = 1;
			}
		}
	}
	
	int t; cin >> t;
	
	while (t --) {
		cin >> n;
		// 如果在t >= 3的时候可以得出n,输出
		if (mp[n]) {
			cout << "YES" << endl;
			continue;
		}
		// 判断在t == 2时是否能够得出n
		// 即判断1 + k + k^2 = n是否有解,(2 <= k <= x, 其中x约等于1e9)
		int l = 2, r = 1e9 + 1000;
		while (l < r) {
			int mid = (l + r + 1) / 2;
			if (mid * mid + mid + 1 > n) {
				r = mid - 1;
			} else {
				l = mid;
			}
		}
		if (l * l + l + 1 == n) {
			cout << "YES" << endl;
			continue;
		}
		cout << "NO" << endl;
	}
	
	return 0;
}

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

In E2 , for n greater 1e12 we can directly use Shree Dharacharya formula to know whether a k exist or not. And for k from 1 to 1e6 we can make a set of sum of G.P . I got this intuition in the contest but was getting TLE while calculating the sum of G.P . :( Got accepted in 1 try post contest.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

need help of E2 , don't know why can't pass test 9 :(( please help , thx a lot! 213588968

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

if (p > (long long)(1e18) / k) break; Why this statement is necessary in E2

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Why there is Rudolph and Rudolf?

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Can somebody help me to spot why is giving Idleness Limit Exceeded?

https://mirror.codeforces.com/contest/1846/submission/213728138

I've tried several things, but still can't find the issue.

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Same bro, did you find the issue?

    • »
      »
      »
      10 months ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      No, I haven't found it yet. I've stopped debugging it for some days as well

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

my very easy to understand solution for E2,#213938261

»
10 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

I think this thing is simpler than editorial in G problem. Call the current status is S, the good effect is A, the bad effect is B. So when you take a medicine, the status transform S & (~A) | B

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

I am getting WA on test case 2 for n = 7 in my submission for E1. I have tried my solution on my local also on the online available gnu c++ compiler it is giving correct answer that is "YES" while when I run it on here it give WA. I am not able to get why so? If anyone here can help me, I will be very thankful to him.

»
10 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Sorry for posting this late, can someone please tell why this gives wrong answer in problem E1 test 2, my approach instead of searching for the exponent I used log to find it, any help would be appreciated, Thanks in advance.

»
10 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

Hi, could anyone help debug my submission? This is for 1846B. My submission is https://mirror.codeforces.com/contest/1846/submission/214305302

Thanks in advance!

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    Note that after finding a winner when you check rows and columns, you just break for loop, meaning you are checking diagonals even if you found the winner.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

What a deceitful problem C!

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

what is k for 1000015000057 in 11th test in E2?

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Why do I get a Idleness Limit Exceeded on my code for F? [Code] Please help

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Hello guys, in 1846F - Rudolph and Mimic, continously getting time limit exceeded, even though I have verified my solution with editorial, and have tried to match it to the author's solution. Can anyone please let me know what could be the issue here :( -> 216464518

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Can anyone tell me why my Code is giving an output of 3 whereas the required output is supposed to be 2 for the following test case(Test Case number 2 — Problem 13).

217202106

Test Case:

1

5 5 14

7 2 9 10 3

5 3 2 9 7

6 1 10 5 7

2 6 9 10 4

10 5 7 8 9

»
9 months ago, # |
  Vote: I like it 0 Vote: I do not like it

why this 221034056 isn't working for c am i missing something

»
8 months ago, # |
Rev. 3   Vote: I like it 0 Vote: I do not like it

I did solve G without using Dijkstra is it hackable?

my idea to use dp is either i take the element either not i know sometimes you'll be forced to take medicine two times or 3 ...

but what i did that i did push the element n*m times so that max number we take that element is n times no more that that is that true? https://mirror.codeforces.com/contest/1846/submission/223492698

»
4 months ago, # |
  Vote: I like it 0 Vote: I do not like it

alternate dp solution for G

code
»
4 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it

1846G is really a nice question,lovely