Ja, det är ju inte världens vackraste kod och den tar dessutom ganska lång tid att exekvera (~10min på en MacBook), på grund av en dålig skriver GCD-algoritm. Det går helt klart att göra mer effektivt...
Lösningen jag kom fram till var att istället för att spegla laserstrålen, så speglar vi rummet. Speglingen sker iterativt och blir ett rutnät med trianglar. När det är gjort drar vi en RAK linje genom hela rutnätet till en viss nivå i iterationen och finna ett hörn som är ingångpunkten. Dock måste vi se till att vi inte passerar några andra hörn på vägen, och det är just det vi använder GCD till!
int main() {
unsigned long long m = 12017639147ull;
unsigned long long s, j, k, x ,y ,g;
if (m % 3 == 2) s = 2;
if (m % 3 == 1) s = 0;
if (m % 3 == 0) s = 1;
j = (m-1)/2 + 3;
unsigned long long count = 0;
k = s + 1;
while(1) {
x = j-k;
y = k-1;
while (x > 0){
g = x;
x = y % x;
y = g;
}
if (g == 1)
count += 1;
k += 3;
if (k > ((j-s)/2))
break;
if(count % 1000000 ==0)
printf("%d\n",count);
}
printf("%d", count*2);
}
No comments:
Post a Comment