#include <iostream>
using namespace std;
// Definition for singly-linked list node
class Node {
public :
int data;
Node* next;
// Constructor
Node( int val) {
data = val;
next = NULL ;
}
} ;
// Function to find the last node in the linked list such that position % K == 0
Node* modularNode( Node* head, int k) {
// Edge cases
if ( head == NULL || k <= 0 )
return NULL ;
Node* result = NULL ;
int position = 1 ;
// Traverse the linked list
Node* current = head;
while ( current ! = NULL ) {
// If current position is divisible by k, update result
if ( position % k == 0 )
result = current;
// Move to next node and increment position
current = current- > next;
position++ ;
}
return result;
}
// Utility function to create a linked list from array
Node* createLinkedList( int arr[ ] , int n) {
if ( n == 0 ) return NULL ;
Node* head = new Node( arr[ 0 ] ) ;
Node* current = head;
for ( int i = 1 ; i < n; i++ ) {
current- > next = new Node( arr[ i] ) ;
current = current- > next;
}
return head;
}
// Utility function to print a linked list
void printLinkedList( Node* head) {
Node* current = head;
while ( current ! = NULL ) {
cout << current- > data;
if ( current- > next ! = NULL )
cout << " -> " ;
current = current- > next;
}
cout << endl;
}
// Test cases
void runTestCase( int testNum, int arr[ ] , int n, int k, int expectedValue) {
Node* head = createLinkedList( arr, n) ;
cout << "Test Case " << testNum << ":" << endl;
cout << "Linked List: " ;
printLinkedList( head) ;
cout << "K = " << k << endl;
Node* result = modularNode( head, k) ;
if ( result == NULL ) {
cout << "Result: NULL" << endl;
if ( expectedValue == - 1 )
cout << "Test PASSED" << endl;
else
cout << "Test FAILED. Expected: " << expectedValue << ", Got: NULL" << endl;
} else {
cout << "Result: Node with value " << result- > data << endl;
if ( result- > data == expectedValue)
cout << "Test PASSED" << endl;
else
cout << "Test FAILED. Expected: " << expectedValue << ", Got: " << result- > data << endl;
}
cout << "----------------------" << endl;
// Clean up memory
while ( head ! = NULL ) {
Node* temp = head;
head = head- > next;
delete temp;
}
}
int main( ) {
// Test Case 1: Example from the problem
// N = 7, K = 3
// Linked List = 1 -> 3 -> 2 -> 4 -> 6 -> 5 -> 7
int arr1[ ] = { 1 , 3 , 2 , 4 , 6 , 5 , 7 } ;
runTestCase( 1 , arr1, 7 , 3 , 6 ) ;
// Test Case 2: Another example
// Linked List = 3 -> 7 -> 1 -> 9 -> 8
// K = 2
int arr2[ ] = { 3 , 7 , 1 , 9 , 8 } ;
runTestCase( 2 , arr2, 5 , 2 , 9 ) ;
// Test Case 3: K larger than list length
int arr3[ ] = { 5 , 8 , 3 , 1 } ;
runTestCase( 3 , arr3, 4 , 5 , - 1 ) ;
// Test Case 4: K = 1 (every node is modular)
int arr4[ ] = { 2 , 4 , 6 , 8 } ;
runTestCase( 4 , arr4, 4 , 1 , 8 ) ;
// Test Case 5: Single element list
int arr5[ ] = { 10 } ;
runTestCase( 5 , arr5, 1 , 1 , 10 ) ;
// Test Case 6: Empty list
runTestCase( 6 , NULL , 0 , 3 , - 1 ) ;
// Test Case 7: Invalid K
int arr7[ ] = { 1 , 2 , 3 } ;
runTestCase( 7 , arr7, 3 , 0 , - 1 ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRGVmaW5pdGlvbiBmb3Igc2luZ2x5LWxpbmtlZCBsaXN0IG5vZGUKY2xhc3MgTm9kZSB7CnB1YmxpYzoKICAgIGludCBkYXRhOwogICAgTm9kZSogbmV4dDsKICAgIAogICAgLy8gQ29uc3RydWN0b3IKICAgIE5vZGUoaW50IHZhbCkgewogICAgICAgIGRhdGEgPSB2YWw7CiAgICAgICAgbmV4dCA9IE5VTEw7CiAgICB9Cn07CgovLyBGdW5jdGlvbiB0byBmaW5kIHRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpbmtlZCBsaXN0IHN1Y2ggdGhhdCBwb3NpdGlvbiAlIEsgPT0gMApOb2RlKiBtb2R1bGFyTm9kZShOb2RlKiBoZWFkLCBpbnQgaykgewogICAgLy8gRWRnZSBjYXNlcwogICAgaWYgKGhlYWQgPT0gTlVMTCB8fCBrIDw9IDApCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAKICAgIE5vZGUqIHJlc3VsdCA9IE5VTEw7CiAgICBpbnQgcG9zaXRpb24gPSAxOwogICAgCiAgICAvLyBUcmF2ZXJzZSB0aGUgbGlua2VkIGxpc3QKICAgIE5vZGUqIGN1cnJlbnQgPSBoZWFkOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIC8vIElmIGN1cnJlbnQgcG9zaXRpb24gaXMgZGl2aXNpYmxlIGJ5IGssIHVwZGF0ZSByZXN1bHQKICAgICAgICBpZiAocG9zaXRpb24gJSBrID09IDApCiAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnQ7CiAgICAgICAgCiAgICAgICAgLy8gTW92ZSB0byBuZXh0IG5vZGUgYW5kIGluY3JlbWVudCBwb3NpdGlvbgogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgICAgIHBvc2l0aW9uKys7CiAgICB9CiAgICAKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbGlua2VkIGxpc3QgZnJvbSBhcnJheQpOb2RlKiBjcmVhdGVMaW5rZWRMaXN0KGludCBhcnJbXSwgaW50IG4pIHsKICAgIGlmIChuID09IDApIHJldHVybiBOVUxMOwogICAgCiAgICBOb2RlKiBoZWFkID0gbmV3IE5vZGUoYXJyWzBdKTsKICAgIE5vZGUqIGN1cnJlbnQgPSBoZWFkOwogICAgCiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGN1cnJlbnQtPm5leHQgPSBuZXcgTm9kZShhcnJbaV0pOwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQogICAgCiAgICByZXR1cm4gaGVhZDsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBhIGxpbmtlZCBsaXN0CnZvaWQgcHJpbnRMaW5rZWRMaXN0KE5vZGUqIGhlYWQpIHsKICAgIE5vZGUqIGN1cnJlbnQgPSBoZWFkOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIGNvdXQgPDwgY3VycmVudC0+ZGF0YTsKICAgICAgICBpZiAoY3VycmVudC0+bmV4dCAhPSBOVUxMKQogICAgICAgICAgICBjb3V0IDw8ICIgLT4gIjsKICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKfQoKLy8gVGVzdCBjYXNlcwp2b2lkIHJ1blRlc3RDYXNlKGludCB0ZXN0TnVtLCBpbnQgYXJyW10sIGludCBuLCBpbnQgaywgaW50IGV4cGVjdGVkVmFsdWUpIHsKICAgIE5vZGUqIGhlYWQgPSBjcmVhdGVMaW5rZWRMaXN0KGFyciwgbik7CiAgICAKICAgIGNvdXQgPDwgIlRlc3QgQ2FzZSAiIDw8IHRlc3ROdW0gPDwgIjoiIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJMaW5rZWQgTGlzdDogIjsKICAgIHByaW50TGlua2VkTGlzdChoZWFkKTsKICAgIGNvdXQgPDwgIksgPSAiIDw8IGsgPDwgZW5kbDsKICAgIAogICAgTm9kZSogcmVzdWx0ID0gbW9kdWxhck5vZGUoaGVhZCwgayk7CiAgICAKICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgIGNvdXQgPDwgIlJlc3VsdDogTlVMTCIgPDwgZW5kbDsKICAgICAgICBpZiAoZXhwZWN0ZWRWYWx1ZSA9PSAtMSkKICAgICAgICAgICAgY291dCA8PCAiVGVzdCBQQVNTRUQiIDw8IGVuZGw7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjb3V0IDw8ICJUZXN0IEZBSUxFRC4gRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWRWYWx1ZSA8PCAiLCBHb3Q6IE5VTEwiIDw8IGVuZGw7CiAgICB9IGVsc2UgewogICAgICAgIGNvdXQgPDwgIlJlc3VsdDogTm9kZSB3aXRoIHZhbHVlICIgPDwgcmVzdWx0LT5kYXRhIDw8IGVuZGw7CiAgICAgICAgaWYgKHJlc3VsdC0+ZGF0YSA9PSBleHBlY3RlZFZhbHVlKQogICAgICAgICAgICBjb3V0IDw8ICJUZXN0IFBBU1NFRCIgPDwgZW5kbDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvdXQgPDwgIlRlc3QgRkFJTEVELiBFeHBlY3RlZDogIiA8PCBleHBlY3RlZFZhbHVlIDw8ICIsIEdvdDogIiA8PCByZXN1bHQtPmRhdGEgPDwgZW5kbDsKICAgIH0KICAgIGNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IGVuZGw7CiAgICAKICAgIC8vIENsZWFuIHVwIG1lbW9yeQogICAgd2hpbGUgKGhlYWQgIT0gTlVMTCkgewogICAgICAgIE5vZGUqIHRlbXAgPSBoZWFkOwogICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OwogICAgICAgIGRlbGV0ZSB0ZW1wOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIC8vIFRlc3QgQ2FzZSAxOiBFeGFtcGxlIGZyb20gdGhlIHByb2JsZW0KICAgIC8vIE4gPSA3LCBLID0gMwogICAgLy8gTGlua2VkIExpc3QgPSAxIC0+IDMgLT4gMiAtPiA0IC0+IDYgLT4gNSAtPiA3CiAgICBpbnQgYXJyMVtdID0gezEsIDMsIDIsIDQsIDYsIDUsIDd9OwogICAgcnVuVGVzdENhc2UoMSwgYXJyMSwgNywgMywgNik7CiAgICAKICAgIC8vIFRlc3QgQ2FzZSAyOiBBbm90aGVyIGV4YW1wbGUKICAgIC8vIExpbmtlZCBMaXN0ID0gMyAtPiA3IC0+IDEgLT4gOSAtPiA4CiAgICAvLyBLID0gMgogICAgaW50IGFycjJbXSA9IHszLCA3LCAxLCA5LCA4fTsKICAgIHJ1blRlc3RDYXNlKDIsIGFycjIsIDUsIDIsIDkpOwogICAgCiAgICAvLyBUZXN0IENhc2UgMzogSyBsYXJnZXIgdGhhbiBsaXN0IGxlbmd0aAogICAgaW50IGFycjNbXSA9IHs1LCA4LCAzLCAxfTsKICAgIHJ1blRlc3RDYXNlKDMsIGFycjMsIDQsIDUsIC0xKTsKICAgIAogICAgLy8gVGVzdCBDYXNlIDQ6IEsgPSAxIChldmVyeSBub2RlIGlzIG1vZHVsYXIpCiAgICBpbnQgYXJyNFtdID0gezIsIDQsIDYsIDh9OwogICAgcnVuVGVzdENhc2UoNCwgYXJyNCwgNCwgMSwgOCk7CiAgICAKICAgIC8vIFRlc3QgQ2FzZSA1OiBTaW5nbGUgZWxlbWVudCBsaXN0CiAgICBpbnQgYXJyNVtdID0gezEwfTsKICAgIHJ1blRlc3RDYXNlKDUsIGFycjUsIDEsIDEsIDEwKTsKICAgIAogICAgLy8gVGVzdCBDYXNlIDY6IEVtcHR5IGxpc3QKICAgIHJ1blRlc3RDYXNlKDYsIE5VTEwsIDAsIDMsIC0xKTsKICAgIAogICAgLy8gVGVzdCBDYXNlIDc6IEludmFsaWQgSwogICAgaW50IGFycjdbXSA9IHsxLCAyLCAzfTsKICAgIHJ1blRlc3RDYXNlKDcsIGFycjcsIDMsIDAsIC0xKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K