* fix: rework challenge to use argument in function * fix: add solution * fix: improve look and spacing
		
			
				
	
	
		
			104 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| id: 5900f3ba1000cf542c50fecd
 | ||
| title: 'Problem 78: Coin partitions'
 | ||
| challengeType: 5
 | ||
| forumTopicId: 302191
 | ||
| dashedName: problem-78-coin-partitions
 | ||
| ---
 | ||
| 
 | ||
| # --description--
 | ||
| 
 | ||
| Let ${p}(n)$ represent the number of different ways in which `n` coins can be separated into piles. For example, five coins can be separated into piles in exactly seven different ways, so ${p}(5) = 7$.
 | ||
| 
 | ||
| <div style='text-align: center;'>
 | ||
| 
 | ||
| | Coin piles        |
 | ||
| | ----------------- |
 | ||
| | OOOOO             |
 | ||
| | OOOO   O          |
 | ||
| | OOO   OO          |
 | ||
| | OOO   O   O       |
 | ||
| | OO   OO   O       |
 | ||
| | OO   O   O   O    |
 | ||
| | O   O   O   O   O |
 | ||
| 
 | ||
| </div><br>
 | ||
| 
 | ||
| Find the least value of `n` for which ${p}(n)$ is divisible by `divisor`.
 | ||
| 
 | ||
| # --hints--
 | ||
| 
 | ||
| `coinPartitions(7)` should return a number.
 | ||
| 
 | ||
| ```js
 | ||
| assert(typeof coinPartitions(7) === 'number');
 | ||
| ```
 | ||
| 
 | ||
| `coinPartitions(7)` should return `5`.
 | ||
| 
 | ||
| ```js
 | ||
| assert.strictEqual(coinPartitions(7), 5);
 | ||
| ```
 | ||
| 
 | ||
| `coinPartitions(10000)` should return `599`.
 | ||
| 
 | ||
| ```js
 | ||
| assert.strictEqual(coinPartitions(10000), 599);
 | ||
| ```
 | ||
| 
 | ||
| `coinPartitions(100000)` should return `11224`.
 | ||
| 
 | ||
| ```js
 | ||
| assert.strictEqual(coinPartitions(100000), 11224);
 | ||
| ```
 | ||
| 
 | ||
| `coinPartitions(1000000)` should return `55374`.
 | ||
| 
 | ||
| ```js
 | ||
| assert.strictEqual(coinPartitions(1000000), 55374);
 | ||
| ```
 | ||
| 
 | ||
| # --seed--
 | ||
| 
 | ||
| ## --seed-contents--
 | ||
| 
 | ||
| ```js
 | ||
| function coinPartitions(divisor) {
 | ||
| 
 | ||
|   return true;
 | ||
| }
 | ||
| 
 | ||
| coinPartitions(7);
 | ||
| ```
 | ||
| 
 | ||
| # --solutions--
 | ||
| 
 | ||
| ```js
 | ||
| function coinPartitions(divisor) {
 | ||
|   const partitions = [1];
 | ||
| 
 | ||
|   let n = 0;
 | ||
|   while (partitions[n] !== 0) {
 | ||
|     n++;
 | ||
|     partitions.push(0);
 | ||
| 
 | ||
|     let i = 0;
 | ||
|     let pentagonal = 1;
 | ||
|     while (pentagonal <= n) {
 | ||
|       const sign = i % 4 > 1 ? -1 : 1;
 | ||
|       partitions[n] += sign * partitions[n - pentagonal];
 | ||
|       partitions[n] = partitions[n] % divisor;
 | ||
| 
 | ||
|       i++;
 | ||
| 
 | ||
|       let k = Math.floor(i / 2) + 1;
 | ||
|       if (i % 2 !== 0) {
 | ||
|         k *= -1;
 | ||
|       }
 | ||
|       pentagonal = Math.floor((k * (3 * k - 1)) / 2);
 | ||
|     }
 | ||
|   }
 | ||
|   return n;
 | ||
| }
 | ||
| ```
 |