Deutsch English Français Italiano |
<vrhl8b$3njm0$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: Richard Heathfield <rjh@cpax.org.uk> Newsgroups: comp.lang.c Subject: Re: OT: CSES Number Spiral algorithm Date: Thu, 20 Mar 2025 18:02:51 +0000 Organization: Fix this later Lines: 63 Message-ID: <vrhl8b$3njm0$1@dont-email.me> References: <vrhgqd$3ku1m$2@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 20 Mar 2025 19:03:00 +0100 (CET) Injection-Info: dont-email.me; posting-host="6f460b36cc498e8c1c99eefb8f44e3e6"; logging-data="3919552"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/rmeWkWl5nLzDasYj208HkBNoTDR6ZSkMnl5dwres8cA==" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:w9GCFlSUDwGwtsoRHmq1TIWfqqU= In-Reply-To: <vrhgqd$3ku1m$2@dont-email.me> Content-Language: en-GB Bytes: 2904 On 20/03/2025 16:47, DFS wrote: > I don't have a C question, but rather I'd like input about > algorithmic approaches. > > https://cses.fi/problemset/task/1071 > > It's an 'infinite grid'. You have to find the value at > rows-columns from 1 to 10^9. > > First thing you notice about the 5x5 grid is the values in > odd-numbered columns begin with the square of the column number, > and the values in even-numbered rows begin with the square of the > row number. > > I followed the number pattern and built a grid in Excel and > expanded it to 10x10 for more testing. > > https://imgur.com/x4VymmA > > Then coded 4 conditions solution > 1. row <= col and col odd (col * col) - row + 1 > 2. row <= col and col even ((col-1) * (col-1)) + row > 3. row > col and row odd ((row-1) * (row-1)) + col > 4. row > col and row even (row * row) - col + 1 > > My full C code submission was accepted the first time. > > How would you have done it? I see that you've already solved it, so that's good. My first observation was the main diagonal, which goes: 1 3 7 13 21... Differences are 2 4 6 8... respectively Consider the triangle numbers (n(n+1)/2): 0 1 3 6 10 15 21 28... Double and add 1: 1 3 7 13 21 31... So the main diagonal is readily calculable - either (row, row) or (col, col). I'd then have picked the biggest out of (row, col) and calculated its triangle number: n(n+1)/2, doubled (so don't divide) and add 1, for (n(n+1))+1 and then either added the column or subtracted the row (whichever of them is smaller). Reviewing your solution after the fact, I don't see the need to distinguish between odd and even. What did I miss? -- Richard Heathfield Email: rjh at cpax dot org dot uk "Usenet is a strange place" - dmr 29 July 1999 Sig line 4 vacant - apply within