#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 128
struct marble {
long count;
struct marble *next;
struct marble *prev;
} *mainroot, *root, *new, *old;
int main(void) {
root
=malloc(sizeof(struct marble
)); root->next = root->prev = root;
root->count=0;
mainroot = root;
char line[LEN];
long maxplayers;
long maxpoints;
sscanf(line
,"%ld players; last marble is worth %ld points", &maxplayers
, &maxpoints
); printf("%ld %ld\n", maxplayers
, maxpoints
); long player[maxplayers];
memset(player
,0,sizeof(player
));
long currentmarble=1;
long toppoint=0;
long currentplayer=0;
while(toppoint<maxpoints)
{
old=mainroot;
while(old->next != mainroot)
{
old = old->next;
}
if(currentmarble%23==0)
{
player[currentplayer] += currentmarble;
for(int i=0;i<7;i++)
root = root->prev;
player[currentplayer] += root->count;
(root->prev)->next = root->next;
(root->next)->prev = root->prev;
old = root;
root = root->next;
} else {
new
= malloc(sizeof(struct marble
)); new->next = (root->next)->next;
root->next->next->prev = new;
new->prev = root->next;
(root->next)->next = new;
new->count = currentmarble++;
root = new;
}
if(toppoint<player[currentplayer])
toppoint=player[currentplayer];
currentplayer++;
currentplayer%=maxplayers;
currentmarble++;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBMRU4gMTI4CgpzdHJ1Y3QgbWFyYmxlIHsKCWxvbmcgY291bnQ7CglzdHJ1Y3QgbWFyYmxlICpuZXh0OwoJc3RydWN0IG1hcmJsZSAqcHJldjsKfSAqbWFpbnJvb3QsICpyb290LCAqbmV3LCAqb2xkOwoKaW50IG1haW4odm9pZCkgewoJcm9vdD1tYWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXJibGUpKTsKCXJvb3QtPm5leHQgPSByb290LT5wcmV2ID0gcm9vdDsKCXJvb3QtPmNvdW50PTA7CgltYWlucm9vdCA9IHJvb3Q7CgljaGFyIGxpbmVbTEVOXTsKCWxvbmcgbWF4cGxheWVyczsKCWxvbmcgbWF4cG9pbnRzOwoJZmdldHMobGluZSxMRU4sc3RkaW4pOwoJc3NjYW5mKGxpbmUsIiVsZCBwbGF5ZXJzOyBsYXN0IG1hcmJsZSBpcyB3b3J0aCAlbGQgcG9pbnRzIiwgJm1heHBsYXllcnMsICZtYXhwb2ludHMpOwoJcHJpbnRmKCIlbGQgJWxkXG4iLCBtYXhwbGF5ZXJzLCBtYXhwb2ludHMpOwoJZXhpdCgwKTsKCWxvbmcgcGxheWVyW21heHBsYXllcnNdOwoJbWVtc2V0KHBsYXllciwwLHNpemVvZihwbGF5ZXIpKTsKCQoJbG9uZyBjdXJyZW50bWFyYmxlPTE7Cglsb25nIHRvcHBvaW50PTA7Cglsb25nIGN1cnJlbnRwbGF5ZXI9MDsKCXdoaWxlKHRvcHBvaW50PG1heHBvaW50cykKCXsKCQlvbGQ9bWFpbnJvb3Q7CgkJd2hpbGUob2xkLT5uZXh0ICE9IG1haW5yb290KQoJCXsKCQkJcHJpbnRmKCIlbGQgIiwgb2xkLT5jb3VudCk7CgkJCW9sZCA9IG9sZC0+bmV4dDsKCQl9CgkJcHJpbnRmKCJcbiIpOwoJCQoJCWlmKGN1cnJlbnRtYXJibGUlMjM9PTApCgkJewoJCQlwbGF5ZXJbY3VycmVudHBsYXllcl0gKz0gY3VycmVudG1hcmJsZTsKCQkJZm9yKGludCBpPTA7aTw3O2krKykKCQkJCXJvb3QgPSByb290LT5wcmV2OwoJCQlwbGF5ZXJbY3VycmVudHBsYXllcl0gKz0gcm9vdC0+Y291bnQ7CgkJCShyb290LT5wcmV2KS0+bmV4dCA9IHJvb3QtPm5leHQ7CgkJCShyb290LT5uZXh0KS0+cHJldiA9IHJvb3QtPnByZXY7CgkJCW9sZCA9IHJvb3Q7CgkJCXJvb3QgPSByb290LT5uZXh0OwoJCQlmcmVlKG9sZCk7CgkJfSBlbHNlIHsKCQkJbmV3ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWFyYmxlKSk7CgkJCW5ldy0+bmV4dCA9IChyb290LT5uZXh0KS0+bmV4dDsKCQkJcm9vdC0+bmV4dC0+bmV4dC0+cHJldiA9IG5ldzsKCQkJbmV3LT5wcmV2ID0gcm9vdC0+bmV4dDsKCQkJKHJvb3QtPm5leHQpLT5uZXh0ID0gbmV3OwoJCQluZXctPmNvdW50ID0gY3VycmVudG1hcmJsZSsrOwoJCQlyb290ID0gbmV3OwoJCX0KCQkKCQlpZih0b3Bwb2ludDxwbGF5ZXJbY3VycmVudHBsYXllcl0pCgkJCXRvcHBvaW50PXBsYXllcltjdXJyZW50cGxheWVyXTsKCQkKCQljdXJyZW50cGxheWVyKys7CgkJY3VycmVudHBsYXllciU9bWF4cGxheWVyczsKCQkKCQljdXJyZW50bWFyYmxlKys7Cgl9CgkKCXByaW50ZigiJWxkXG4iLHRvcHBvaW50KTsKCQoJcmV0dXJuIDA7Cn0K