Блог пользователя chokudai

Автор chokudai, история, 6 лет назад, По-английски

We will hold Panasonic Programming Contest (AtCoder Beginner Contest 186).

The point values will be 100-200-300-400-500-600.

We are looking forward to your participation!

  • Проголосовать: нравится
  • +69
  • Проголосовать: не нравится

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +16 Проголосовать: не нравится

Are there any plans to hold an ABC on Sunday as well? Considering next week is goodbye rng_58 and many would like to jump that 2000 barrier to participate in them.

»
6 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится +30 Проголосовать: не нравится

If anyone is interested, I'm currently planning to do a post-contest stream (twitch.tv/AnandOza).

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

Why don't you show start time like cf announcements? Or is there any reason you give just a link ?

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

What is special about this contest?

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

very nice contest(especially problem D)

btw, how to solve F??

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

(k.x + s) % n = 0

given, n, s, and k, how to find the smallest x which satisfies this equation? I didn't try brute force as it will give TLE for sure.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Even, if there was a brute force approach, it won't work for the sample test case (I tried for 10^7 iterations) and one of the testcases was giving the wrong answer.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    This is what I did.
    (k.x)%n=(-s)%n
    Let g=gcd(k,n).
    We know that (k.x)%n takes all (i*g)%n values.
    If ((-s)%n)%g is non zero than answer is -1.
    For other case just divide k, n, and (-s)%n by g.
    Now the equation changes to (a*b)%m=c where gcd(b,m) is 1.
    It has a unique soln for a in range [0,m). Its a=(inv(b)*c)%m. You can use extended gcd to find that inverse.

    • »
      »
      »
      6 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      this is better, I did it by finding $$$x0, y0$$$ using euclids algorithm, and then checking sign and adjusting. Actually $$$s \lt n$$$ so no need of modulo $$$n$$$.

    • »
      »
      »
      6 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +5 Проголосовать: не нравится

      According to cp-algorithm if we convert ax = b (mod m) to a/g x = b/g (mod m/g), this new equation's unique solution x' is not the only solution of original equation, there are exactly g solutions: x = x' + i m/g (mod m) for i in [0,g). How to prove that x' is the minimum solution?

      • »
        »
        »
        »
        6 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        I tried to implement that, but no success. Can you shortly tell which of the input numbers n,k,s are the variables a,b,n of cp-algorithm?

        Not working code
      • »
        »
        »
        »
        6 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        All those g solns have same value mod (m/g). Just take the one with i=0 which is returned in above soln.

  • »
    »
    6 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Use extended euclid's algo to just find any solution to k.x-n.y=-s, then use shifting to find for finding minimum x>0

»
6 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

how to solve E,F?

  • »
    »
    6 лет назад, скрыть # ^ |
    ← Rev. 4  
    Проголосовать: нравится 0 Проголосовать: не нравится

    Here is how I solved problem E.

    So assume that position of the throne is at position n and we are at position s.

    So to reach the throne following equation can be formed —

    s + x*k = y*n where(x is the lowest positive integer)

    So this equation can interpreted as ax + by = c which is standard linear dopamine equation.(There are many good resources for this on internet).

    • »
      »
      »
      6 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      I was able to do until this point but can you tell how you solved this equation

      • »
        »
        »
        »
        6 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +3 Проголосовать: не нравится

        So we are having this equation right x*(-k) + y*n = s

        You can learn about solving such equation over here

        Now after reading that we have all the possible values of x that are in form of x = x0 — m*(n/g), and we need to find the a value of m for which x is the lowest possible equation which can easily be solved by basic math.

      • »
        »
        »
        »
        6 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится

        Considering the process to calculate the greatest common divisor $$$d$$$ of $$$a$$$ and $$$b$$$. Let's try to get a pair $$$(x,y)$$$ such that $$$ax+by=d$$$. When $$$b=0$$$ , $$$d=a$$$ so that we can set $$$x=1$$$ and $$$y=0$$$. Assume that we have already known $$$bx+(a\%b)y=d$$$. Then $$$d=bx+(a-(a/b)*b)y=ay+b(x-(a/b))$$$ so we can change $$$x$$$ into $$$y$$$ and change $$$y$$$ into $$$x-(a/b)$$$ at the same time. Repeat the operation above so that you can get a pair $$$(x_0,y_0)$$$ such that $$$ax_0+by_0=d$$$. All of the pairs $$$(x,y)$$$ satisfy the condition if and only if $$$x=x_0+k(b/d)$$$ and $$$y=y_0+k(a/d)$$$ ($$$k$$$ can be any integer).

        You can have a look at the following function to understand better.

        int x,y;
        int exgcd(int a,int b)
        {
        	if(b==0)
        	{
        		x=1,y=0;
        		return a;
        	}
        	int d=exgcd(b,a%b);
        	int p=y,q=x-y*(a/b);
        	x=p,y=q;
        	return d;
        }
        
  • »
    »
    6 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    I have a solution for F involving policy-based DS(indexed set).
    First, you calculate the number of cells reachable by using steps down and then right.
    Then you need to calculate (for every column) how many rows are there such that their minimum y is less than the current column number. Add that number to the answer. This can be done using a Policy-based DS.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    One solution for F is as follow :

    Let us find 2 arrays, call them R[H], C[W] and initialize R[i] = {w+1}, and C[i] = {h+1} for each valid i. So, the information we store in R[i] = first column which has a block in ith row, similarly , C[i] = first row which has a block in ith column.

    Now in first move we can go to anything from [1,R[1]] and [1,C[1]] and then we also have stored value, of how many blocks we can visit in front of each of them . So, we just add them up.

    Are we considering all the blocks which can be visited ? Yes. But, we also need to now remove the blocks which can be visited from both paths, going right then down or going down and then right.

    To count these cases, here is one approach 
    for each row, the maximum such blocks which can be repeated are min(R[1],R[i]), and we will not be repeating the cases, if there exists a row above them, which has any of these columns blocked.
    So, sort the blocked points by row, then for each row, insert the columns into a set, and we need to get lower bound for min(R[1],R[i]). 
    

    You can use pbds, segment tree or anything you like to answer these queries.

    Code

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

did some one use BIT TREE TO solve F ? if yes share ur code plz

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

How to solve C for larger constraints? Preferably,$$$N \lt =$$$ 10^18

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

How to solve E? I was able to deduce that if throne positon is not divible by gcd of n and k answer is -1. But i couldnt figure out final answer without doing brute force.

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

This is a really good contest. Although I didn't do as well as I want,(I got WA 3 times during the contest) it shows me that I have something unfamiliar with and I must be more careful to make my solutions correct.

At the same time, I won't be able to join in AtCoder Grand Contest 050 (Good Bye rng_58) as a rated contest. So I hope that there is going to be another contest before the AGC contest for people like me.

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

So what's the editorial of F?

I think about it for a long time, but just can't solve it.

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    Maybe you can have a look at my code first, I am trying to write the editorial for F now.

  • »
    »
    6 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится +1 Проголосовать: не нравится

    First, calculate $$$a[i]$$$ which means the number of squares in the $$$i$$$-th row that you can reach (from $$$(i,0)$$$ in one move) and $$$b[i]$$$ for the $$$i$$$-th column, respectively.

    Set $$$c=a[1]$$$ and $$$d=b[1]$$$, so that you should only consider the first $$$d$$$ rows and the first $$$c$$$ columns. The only problem we need to solve now is to calculate the number of sqaures $$$(x,y)$$$ such that $$$1 \le x \le d$$$, $$$1 \le y \le c$$$, $$$y \le a[x]$$$ and $$$x \le b[y]$$$.

    We solve this problem in the ascending order of $$$b$$$. When we consider $$$i$$$, we need to put the first $$$b[i]$$$ elements of $$$a$$$ in BIT so that we can only calculate the number of elements which are not less than $$$i$$$ in BIT, which is called $$$p[i]$$$.

    Finally, the answer is $$$\sum_{i=1}^c(b[i]-p[i])+\sum_{i=1}^da[i]$$$.

»
6 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится

Problem E

We start at position S, and need to count the number of steps to get to position 0. One step goes K positions. So

$$$x\cdot k=n-s$$$ |mod n

Implementing this according to https://cp-algorithms.com/algebra/linear_congruence_equation.html produces nonsense results for me.

Can somebody explain?

Code, not working

Edit: I am aware that there are basically 3 possible solutions (maybe some more): Linear Congruence Equation which is based on the inverse. The Diophantene equations which are based on the extended euclediean algo. And we can also solve this using the chinese remainder theorem (with only one equation).

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    While I am not aware of the Linear Congruence Equation method — I am reasonably sure it should be if(b%g!=0) in your lce method.

    • »
      »
      »
      6 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      Thanks, that was wrong in the code.

      But the more basic error is stated in the editorial know: The inverse modulo M can be calculated with extended Euclidean algorithm. (Note that $$$A^{M-2}$$$ is not necessarily the inverse of A if M is not a prime)

      So I did wrong in calculating the inverse always with pow(a, m-2).

    • »
      »
      »
      6 лет назад, скрыть # ^ |
      ← Rev. 2  
      Проголосовать: нравится 0 Проголосовать: не нравится

      Can you plz confirm that (b%g != 0) comes from the fact that for any linear congruence a = b(modm) this must satisfy -> m | (a-b). As we have already taken the gcd of a and m. So, remaining b must be divisible by m in order the satisfy the condition? Correct me if i am wrong! And one more thing if gcd is not 1 then, inverse shouldn't exist. But here we are still checking the condition (b%g != 0) and after that we are finding the inverse. CODE

  • »
    »
    6 лет назад, скрыть # ^ |
     
    Проголосовать: нравится +3 Проголосовать: не нравится

    (b%g!=0) is one, also i was getting garbage values until i realised that modular exponentiation can only be used to find inverse if the given "mod" is a prime. Else it'll give wrong answers. i applied the same to your code and it gets right answers.I also changed MOD=n just in case.

    AC

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

can someone suggest me the problem simillar to E for practice?

»
6 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Problem E was kinda similar to this codechef problem CVDRUN. Although constraints are smaller on this.

»
6 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится +3 Проголосовать: не нравится

For problem E, In the editorial, its mentioned the answer is (Ainverse * B) for AX ≡ B mod M .. suppose if A = 3 , B = 6 , M = 10.. then (Ainverse * B) = 7*6 = 42 which satisfies the equation but isn't the minimum X , the minimum X is 2. How can we find the minimum X ?