day2 (no time yesterday)
Im retarded
#include <stdint.h>
#include <stdio.h>
#include <math.h>
static inline short isPrime(long x){
if(x == 2 || x == 3 || x == 5 || x == 7 || x == 11) return 1;
else return 0;
}
static inline long getDigits(long x){
return x < 10 ? 1 : 1 + getDigits (x / 10);
}
static inline long upperHalf(long x, int n){
long digits = getDigits(x);
long keep = (digits + n - 1) / n;
long divisor = (long)pow(10, digits - keep);
return x / divisor;
}
static inline long sillyNumber(long x, int div) {
return x * (long)pow(10, getDigits(x)) + x;
}
static inline long getInvalid(long rangeMin, long rangeMax, int div){
long invID = 0, sNumberF = sillyNumber(upperHalf(rangeMin, div), div), sNumberL = sillyNumber(upperHalf(rangeMax, div), div);
if(sNumberF >= rangeMin && sNumberF <= rangeMax) invID+=sNumberF;
if(getDigits(sNumberF) == getDigits(sNumberL) && sNumberF == sNumberL) return invID;
long rangeMinDigits = getDigits(rangeMin);
long sNumberIm;
if (rangeMinDigits % div) sNumberIm = upperHalf((long)pow(10, rangeMinDigits), div);
else sNumberIm = upperHalf(rangeMin, div) + 1;
for(;sNumberIm < upperHalf(rangeMax, div) && sillyNumber(sNumberIm, div) < rangeMax; sNumberIm++) {
int sIm = sillyNumber(sNumberIm, div);
invID += sIm;
for(long ndiv = div-1, mul = 10; ndiv>1; ndiv--, mul*=10){
if(!isPrime(ndiv)) continue;
if (sillyNumber(upperHalf(sIm, ndiv), ndiv) == sIm) invID -= sIm;
}
}
if(sNumberL >= rangeMin && sNumberL <= rangeMax) invID+=sNumberL;
return invID;
}
int main(){
long rangeMin = 0, rangeMax = 0, invID = 0;
while(scanf("%ld-%ld,", &rangeMin, &rangeMax) != EOF){
for(int digits = getDigits(rangeMax), i = 2; i <= digits; i++){
if(isPrime(i)) invID += getInvalid(rangeMin, rangeMax, i);
}
}
printf("%ld\n", invID);
}