| /*
* Solution to Project Euler problem 99
* By Nayuki Minase
*
* http://nayuki.eigenstate.org/page/project-euler-solutions
* https://github.com/nayuki/Project-Euler-solutions
*/
import java.math.BigInteger;
public final class p099 implements EulerSolution {
public static void main(String[] args) {
System.out.println(new p099().run());
}
public String run() {
int[] maxVal = DATA[0];
int maxIndex = 0;
outer:
for (int i = 1; i < DATA.length; i++) {
// Try limited-precision comparisons, retrying with increasing precision
for (int precision = 16; precision <= 1024; precision *= 2) {
// Use interval arithmetic for approximate comparisons
BigFloat curLow = new BigFloat(DATA[i][0]).power(DATA[i][1], precision, false);
BigFloat curHigh = new BigFloat(DATA[i][0]).power(DATA[i][1], precision, true );
BigFloat maxLow = new BigFloat(maxVal[0] ).power(maxVal [1], precision, false);
BigFloat maxHigh = new BigFloat(maxVal[0] ).power(maxVal [1], precision, true );
if (curLow.compareTo(maxHigh) > 0) {
maxVal = DATA[i];
maxIndex = i;
continue outer;
} else if (curHigh.compareTo(maxLow) < 0)
continue outer;
}
// Do full-precision comparison (very slow)
BigInteger cur = BigInteger.valueOf(DATA[i][0]).pow(DATA[i][1]);
BigInteger max = BigInteger.valueOf(maxVal [0]).pow(maxVal [1]);
if (cur.compareTo(max) > 0) {
maxVal = DATA[i];
maxIndex = i;
}
}
return Integer.toString(maxIndex + 1);
}
// Represents a strictly positive number equal to mantissa * 2^exponent
private static final class BigFloat implements Comparable<BigFloat> {
private final BigInteger mantissa;
private final int exponent;
public BigFloat(int n) {
if (n <= 0)
throw new IllegalArgumentException();
mantissa = BigInteger.valueOf(n);
exponent = 0;
}
private BigFloat(BigInteger man, int exp) {
mantissa = man;
exponent = exp;
}
public int compareTo(BigFloat other) {
int minExp = Math.min(exponent, other.exponent);
BigInteger tempx = mantissa.shiftLeft(exponent - minExp);
BigInteger tempy = other.mantissa.shiftLeft(other.exponent - minExp);
return tempx.compareTo(tempy);
}
public String toString() {
return mantissa + "<<" + exponent;
}
// The output's mantissa will have 'precision' or fewer bits
public BigFloat multiply(BigFloat other, int precision, boolean roundUp) {
BigInteger man = mantissa.multiply(other.mantissa);
int exp = exponent + other.exponent;
int excess = man.bitLength() - precision;
if (excess > 0) {
if (roundUp) {
BigInteger mask = BigInteger.ONE.shiftLeft(excess).subtract(BigInteger.ONE);
if (!mask.and(man).equals(BigInteger.ZERO))
man = man.add(BigInteger.ONE.shiftLeft(excess));
excess = man.bitLength() - precision; // In case 'man' is bumped up to the next power of 2
}
man = man.shiftRight(excess);
exp += excess;
}
return new BigFloat(man, exp);
}
// Exponentiation by squaring
public BigFloat power(int y, int precision, boolean roundUp) {
if (y < 0 || precision <= 0)
throw new IllegalArgumentException();
BigFloat x = this;
BigFloat z = new BigFloat(1);
for (; y != 0; y >>>= 1) {
if ((y & 1) != 0)
z = z.multiply(x, precision, roundUp);
x = x.multiply(x, precision, roundUp);
}
return z;
}
}
private static int[][] DATA = {
{519432,525806},
{632382,518061},
{78864,613712},
{466580,530130},
{780495,510032},
{525895,525320},
{15991,714883},
{960290,502358},
{760018,511029},
{166800,575487},
{210884,564478},
{555151,523163},
{681146,515199},
{563395,522587},
{738250,512126},
{923525,503780},
{595148,520429},
{177108,572629},
{750923,511482},
{440902,532446},
{881418,505504},
{422489,534197},
{979858,501616},
{685893,514935},
{747477,511661},
{167214,575367},
{234140,559696},
{940238,503122},
{728969,512609},
{232083,560102},
{900971,504694},
{688801,514772},
{189664,569402},
{891022,505104},
{445689,531996},
{119570,591871},
{821453,508118},
{371084,539600},
{911745,504251},
{623655,518600},
{144361,582486},
{352442,541775},
{420726,534367},
{295298,549387},
{6530,787777},
{468397,529976},
{672336,515696},
{431861,533289},
{84228,610150},
{805376,508857},
{444409,532117},
{33833,663511},
{381850,538396},
{402931,536157},
{92901,604930},
{304825,548004},
{731917,512452},
{753734,511344},
{51894,637373},
{151578,580103},
{295075,549421},
{303590,548183},
{333594,544123},
{683952,515042},
{60090,628880},
{951420,502692},
{28335,674991},
{714940,513349},
{343858,542826},
{549279,523586},
{804571,508887},
{260653,554881},
{291399,549966},
{402342,536213},
{408889,535550},
{40328,652524},
{375856,539061},
{768907,510590},
{165993,575715},
{976327,501755},
{898500,504795},
{360404,540830},
{478714,529095},
{694144,514472},
{488726,528258},
{841380,507226},
{328012,544839},
{22389,690868},
{604053,519852},
{329514,544641},
{772965,510390},
{492798,527927},
{30125,670983},
{895603,504906},
{450785,531539},
{840237,507276},
{380711,538522},
{63577,625673},
{76801,615157},
{502694,527123},
{597706,520257},
{310484,547206},
{944468,502959},
{121283,591152},
{451131,531507},
{566499,522367},
{425373,533918},
{40240,652665},
{39130,654392},
{714926,513355},
{469219,529903},
{806929,508783},
{287970,550487},
{92189,605332},
{103841,599094},
{671839,515725},
{452048,531421},
{987837,501323},
{935192,503321},
{88585,607450},
{613883,519216},
{144551,582413},
{647359,517155},
{213902,563816},
{184120,570789},
{258126,555322},
{502546,527130},
{407655,535678},
{401528,536306},
{477490,529193},
{841085,507237},
{732831,512408},
{833000,507595},
{904694,504542},
{581435,521348},
{455545,531110},
{873558,505829},
{94916,603796},
{720176,513068},
{545034,523891},
{246348,557409},
{556452,523079},
{832015,507634},
{173663,573564},
{502634,527125},
{250732,556611},
{569786,522139},
{216919,563178},
{521815,525623},
{92304,605270},
{164446,576167},
{753413,511364},
{11410,740712},
{448845,531712},
{925072,503725},
{564888,522477},
{7062,780812},
{641155,517535},
{738878,512100},
{636204,517828},
{372540,539436},
{443162,532237},
{571192,522042},
{655350,516680},
{299741,548735},
{581914,521307},
{965471,502156},
{513441,526277},
{808682,508700},
{237589,559034},
{543300,524025},
{804712,508889},
{247511,557192},
{543486,524008},
{504383,526992},
{326529,545039},
{792493,509458},
{86033,609017},
{126554,589005},
{579379,521481},
{948026,502823},
{404777,535969},
{265767,554022},
{266876,553840},
{46631,643714},
{492397,527958},
{856106,506581},
{795757,509305},
{748946,511584},
{294694,549480},
{409781,535463},
{775887,510253},
{543747,523991},
{210592,564536},
{517119,525990},
{520253,525751},
{247926,557124},
{592141,520626},
{346580,542492},
{544969,523902},
{506501,526817},
{244520,557738},
{144745,582349},
{69274,620858},
{292620,549784},
{926027,503687},
{736320,512225},
{515528,526113},
{407549,535688},
{848089,506927},
{24141,685711},
{9224,757964},
{980684,501586},
{175259,573121},
{489160,528216},
{878970,505604},
{969546,502002},
{525207,525365},
{690461,514675},
{156510,578551},
{659778,516426},
{468739,529945},
{765252,510770},
{76703,615230},
{165151,575959},
{29779,671736},
{928865,503569},
{577538,521605},
{927555,503618},
{185377,570477},
{974756,501809},
{800130,509093},
{217016,563153},
{365709,540216},
{774508,510320},
{588716,520851},
{631673,518104},
{954076,502590},
{777828,510161},
{990659,501222},
{597799,520254},
{786905,509727},
{512547,526348},
{756449,511212},
{869787,505988},
{653747,516779},
{84623,609900},
{839698,507295},
{30159,670909},
{797275,509234},
{678136,515373},
{897144,504851},
{989554,501263},
{413292,535106},
{55297,633667},
{788650,509637},
{486748,528417},
{150724,580377},
{56434,632490},
{77207,614869},
{588631,520859},
{611619,519367},
{100006,601055},
{528924,525093},
{190225,569257},
{851155,506789},
{682593,515114},
{613043,519275},
{514673,526183},
{877634,505655},
{878905,505602},
{1926,914951},
{613245,519259},
{152481,579816},
{841774,507203},
{71060,619442},
{865335,506175},
{90244,606469},
{302156,548388},
{399059,536557},
{478465,529113},
{558601,522925},
{69132,620966},
{267663,553700},
{988276,501310},
{378354,538787},
{529909,525014},
{161733,576968},
{758541,511109},
{823425,508024},
{149821,580667},
{269258,553438},
{481152,528891},
{120871,591322},
{972322,501901},
{981350,501567},
{676129,515483},
{950860,502717},
{119000,592114},
{392252,537272},
{191618,568919},
{946699,502874},
{289555,550247},
{799322,509139},
{703886,513942},
{194812,568143},
{261823,554685},
{203052,566221},
{217330,563093},
{734748,512313},
{391759,537328},
{807052,508777},
{564467,522510},
{59186,629748},
{113447,594545},
{518063,525916},
{905944,504492},
{613922,519213},
{439093,532607},
{445946,531981},
{230530,560399},
{297887,549007},
{459029,530797},
{403692,536075},
{855118,506616},
{963127,502245},
{841711,507208},
{407411,535699},
{924729,503735},
{914823,504132},
{333725,544101},
{176345,572832},
{912507,504225},
{411273,535308},
{259774,555036},
{632853,518038},
{119723,591801},
{163902,576321},
{22691,689944},
{402427,536212},
{175769,572988},
{837260,507402},
{603432,519893},
{313679,546767},
{538165,524394},
{549026,523608},
{61083,627945},
{898345,504798},
{992556,501153},
{369999,539727},
{32847,665404},
{891292,505088},
{152715,579732},
{824104,507997},
{234057,559711},
{730507,512532},
{960529,502340},
{388395,537687},
{958170,502437},
{57105,631806},
{186025,570311},
{993043,501133},
{576770,521664},
{215319,563513},
{927342,503628},
{521353,525666},
{39563,653705},
{752516,511408},
{110755,595770},
{309749,547305},
{374379,539224},
{919184,503952},
{990652,501226},
{647780,517135},
{187177,570017},
{168938,574877},
{649558,517023},
{278126,552016},
{162039,576868},
{658512,516499},
{498115,527486},
{896583,504868},
{561170,522740},
{747772,511647},
{775093,510294},
{652081,516882},
{724905,512824},
{499707,527365},
{47388,642755},
{646668,517204},
{571700,522007},
{180430,571747},
{710015,513617},
{435522,532941},
{98137,602041},
{759176,511070},
{486124,528467},
{526942,525236},
{878921,505604},
{408313,535602},
{926980,503640},
{882353,505459},
{566887,522345},
{3326,853312},
{911981,504248},
{416309,534800},
{392991,537199},
{622829,518651},
{148647,581055},
{496483,527624},
{666314,516044},
{48562,641293},
{672618,515684},
{443676,532187},
{274065,552661},
{265386,554079},
{347668,542358},
{31816,667448},
{181575,571446},
{961289,502320},
{365689,540214},
{987950,501317},
{932299,503440},
{27388,677243},
{746701,511701},
{492258,527969},
{147823,581323},
{57918,630985},
{838849,507333},
{678038,515375},
{27852,676130},
{850241,506828},
{818403,508253},
{131717,587014},
{850216,506834},
{904848,504529},
{189758,569380},
{392845,537217},
{470876,529761},
{925353,503711},
{285431,550877},
{454098,531234},
{823910,508003},
{318493,546112},
{766067,510730},
{261277,554775},
{421530,534289},
{694130,514478},
{120439,591498},
{213308,563949},
{854063,506662},
{365255,540263},
{165437,575872},
{662240,516281},
{289970,550181},
{847977,506933},
{546083,523816},
{413252,535113},
{975829,501767},
{361540,540701},
{235522,559435},
{224643,561577},
{736350,512229},
{328303,544808},
{35022,661330},
{307838,547578},
{474366,529458},
{873755,505819},
{73978,617220},
{827387,507845},
{670830,515791},
{326511,545034},
{309909,547285},
{400970,536363},
{884827,505352},
{718307,513175},
{28462,674699},
{599384,520150},
{253565,556111},
{284009,551093},
{343403,542876},
{446557,531921},
{992372,501160},
{961601,502308},
{696629,514342},
{919537,503945},
{894709,504944},
{892201,505051},
{358160,541097},
{448503,531745},
{832156,507636},
{920045,503924},
{926137,503675},
{416754,534757},
{254422,555966},
{92498,605151},
{826833,507873},
{660716,516371},
{689335,514746},
{160045,577467},
{814642,508425},
{969939,501993},
{242856,558047},
{76302,615517},
{472083,529653},
{587101,520964},
{99066,601543},
{498005,527503},
{709800,513624},
{708000,513716},
{20171,698134},
{285020,550936},
{266564,553891},
{981563,501557},
{846502,506991},
{334,1190800},
{209268,564829},
{9844,752610},
{996519,501007},
{410059,535426},
{432931,533188},
{848012,506929},
{966803,502110},
{983434,501486},
{160700,577267},
{504374,526989},
{832061,507640},
{392825,537214},
{443842,532165},
{440352,532492},
{745125,511776},
{13718,726392},
{661753,516312},
{70500,619875},
{436952,532814},
{424724,533973},
{21954,692224},
{262490,554567},
{716622,513264},
{907584,504425},
{60086,628882},
{837123,507412},
{971345,501940},
{947162,502855},
{139920,584021},
{68330,621624},
{666452,516038},
{731446,512481},
{953350,502619},
{183157,571042},
{845400,507045},
{651548,516910},
{20399,697344},
{861779,506331},
{629771,518229},
{801706,509026},
{189207,569512},
{737501,512168},
{719272,513115},
{479285,529045},
{136046,585401},
{896746,504860},
{891735,505067},
{684771,514999},
{865309,506184},
{379066,538702},
{503117,527090},
{621780,518717},
{209518,564775},
{677135,515423},
{987500,501340},
{197049,567613},
{329315,544673},
{236756,559196},
{357092,541226},
{520440,525733},
{213471,563911},
{956852,502490},
{702223,514032},
{404943,535955},
{178880,572152},
{689477,514734},
{691351,514630},
{866669,506128},
{370561,539656},
{739805,512051},
{71060,619441},
{624861,518534},
{261660,554714},
{366137,540160},
{166054,575698},
{601878,519990},
{153445,579501},
{279899,551729},
{379166,538691},
{423209,534125},
{675310,515526},
{145641,582050},
{691353,514627},
{917468,504026},
{284778,550976},
{81040,612235},
{161699,576978},
{616394,519057},
{767490,510661},
{156896,578431},
{427408,533714},
{254849,555884},
{737217,512182},
{897133,504851},
{203815,566051},
{270822,553189},
{135854,585475},
{778805,510111},
{784373,509847},
{305426,547921},
{733418,512375},
{732087,512448},
{540668,524215},
{702898,513996},
{628057,518328},
{640280,517587},
{422405,534204},
{10604,746569},
{746038,511733},
{839808,507293},
{457417,530938},
{479030,529064},
{341758,543090},
{620223,518824},
{251661,556451},
{561790,522696},
{497733,527521},
{724201,512863},
{489217,528217},
{415623,534867},
{624610,518548},
{847541,506953},
{432295,533249},
{400391,536421},
{961158,502319},
{139173,584284},
{421225,534315},
{579083,521501},
{74274,617000},
{701142,514087},
{374465,539219},
{217814,562985},
{358972,540995},
{88629,607424},
{288597,550389},
{285819,550812},
{538400,524385},
{809930,508645},
{738326,512126},
{955461,502535},
{163829,576343},
{826475,507891},
{376488,538987},
{102234,599905},
{114650,594002},
{52815,636341},
{434037,533082},
{804744,508880},
{98385,601905},
{856620,506559},
{220057,562517},
{844734,507078},
{150677,580387},
{558697,522917},
{621751,518719},
{207067,565321},
{135297,585677},
{932968,503404},
{604456,519822},
{579728,521462},
{244138,557813},
{706487,513800},
{711627,513523},
{853833,506674},
{497220,527562},
{59428,629511},
{564845,522486},
{623621,518603},
{242689,558077},
{125091,589591},
{363819,540432},
{686453,514901},
{656813,516594},
{489901,528155},
{386380,537905},
{542819,524052},
{243987,557841},
{693412,514514},
{488484,528271},
{896331,504881},
{336730,543721},
{728298,512647},
{604215,519840},
{153729,579413},
{595687,520398},
{540360,524240},
{245779,557511},
{924873,503730},
{509628,526577},
{528523,525122},
{3509,847707},
{522756,525555},
{895447,504922},
{44840,646067},
{45860,644715},
{463487,530404},
{398164,536654},
{894483,504959},
{619415,518874},
{966306,502129},
{990922,501212},
{835756,507474},
{548881,523618},
{453578,531282},
{474993,529410},
{80085,612879},
{737091,512193},
{50789,638638},
{979768,501620},
{792018,509483},
{665001,516122},
{86552,608694},
{462772,530469},
{589233,520821},
{891694,505072},
{592605,520594},
{209645,564741},
{42531,649269},
{554376,523226},
{803814,508929},
{334157,544042},
{175836,572970},
{868379,506051},
{658166,516520},
{278203,551995},
{966198,502126},
{627162,518387},
{296774,549165},
{311803,547027},
{843797,507118},
{702304,514032},
{563875,522553},
{33103,664910},
{191932,568841},
{543514,524006},
{506835,526794},
{868368,506052},
{847025,506971},
{678623,515342},
{876139,505726},
{571997,521984},
{598632,520198},
{213590,563892},
{625404,518497},
{726508,512738},
{689426,514738},
{332495,544264},
{411366,535302},
{242546,558110},
{315209,546555},
{797544,509219},
{93889,604371},
{858879,506454},
{124906,589666},
{449072,531693},
{235960,559345},
{642403,517454},
{720567,513047},
{705534,513858},
{603692,519870},
{488137,528302},
{157370,578285},
{63515,625730},
{666326,516041},
{619226,518883},
{443613,532186},
{597717,520257},
{96225,603069},
{86940,608450},
{40725,651929},
{460976,530625},
{268875,553508},
{270671,553214},
{363254,540500},
{384248,538137},
{762889,510892},
{377941,538833},
{278878,551890},
{176615,572755},
{860008,506412},
{944392,502967},
{608395,519571},
{225283,561450},
{45095,645728},
{333798,544090},
{625733,518476},
{995584,501037},
{506135,526853},
{238050,558952},
{557943,522972},
{530978,524938},
{634244,517949},
{177168,572616},
{85200,609541},
{953043,502630},
{523661,525484},
{999295,500902},
{840803,507246},
{961490,502312},
{471747,529685},
{380705,538523},
{911180,504275},
{334149,544046},
{478992,529065},
{325789,545133},
{335884,543826},
{426976,533760},
{749007,511582},
{667067,516000},
{607586,519623},
{674054,515599},
{188534,569675},
{565185,522464},
{172090,573988},
{87592,608052},
{907432,504424},
{8912,760841},
{928318,503590},
{757917,511138},
{718693,513153},
{315141,546566},
{728326,512645},
{353492,541647},
{638429,517695},
{628892,518280},
{877286,505672},
{620895,518778},
{385878,537959},
{423311,534113},
{633501,517997},
{884833,505360},
{883402,505416},
{999665,500894},
{708395,513697},
{548142,523667},
{756491,511205},
{987352,501340},
{766520,510705},
{591775,520647},
{833758,507563},
{843890,507108},
{925551,503698},
{74816,616598},
{646942,517187},
{354923,541481},
{256291,555638},
{634470,517942},
{930904,503494},
{134221,586071},
{282663,551304},
{986070,501394},
{123636,590176},
{123678,590164},
{481717,528841},
{423076,534137},
{866246,506145},
{93313,604697},
{783632,509880},
{317066,546304},
{502977,527103},
{141272,583545},
{71708,618938},
{617748,518975},
{581190,521362},
{193824,568382},
{682368,515131},
{352956,541712},
{351375,541905},
{505362,526909},
{905165,504518},
{128645,588188},
{267143,553787},
{158409,577965},
{482776,528754},
{628896,518282},
{485233,528547},
{563606,522574},
{111001,595655},
{115920,593445},
{365510,540237},
{959724,502374},
{938763,503184},
{930044,503520},
{970959,501956},
{913658,504176},
{68117,621790},
{989729,501253},
{567697,522288},
{820427,508163},
{54236,634794},
{291557,549938},
{124961,589646},
{403177,536130},
{405421,535899},
{410233,535417},
{815111,508403},
{213176,563974},
{83099,610879},
{998588,500934},
{513640,526263},
{129817,587733},
{1820,921851},
{287584,550539},
{299160,548820},
{860621,506386},
{529258,525059},
{586297,521017},
{953406,502616},
{441234,532410},
{986217,501386},
{781938,509957},
{461247,530595},
{735424,512277},
{146623,581722},
{839838,507288},
{510667,526494},
{935085,503327},
{737523,512167},
{303455,548204},
{992779,501145},
{60240,628739},
{939095,503174},
{794368,509370},
{501825,527189},
{459028,530798},
{884641,505363},
{512287,526364},
{835165,507499},
{307723,547590},
{160587,577304},
{735043,512300},
{493289,527887},
{110717,595785},
{306480,547772},
{318593,546089},
{179810,571911},
{200531,566799},
{314999,546580},
{197020,567622},
{301465,548487},
{237808,559000},
{131944,586923},
{882527,505449},
{468117,530003},
{711319,513541},
{156240,578628},
{965452,502162},
{992756,501148},
{437959,532715},
{739938,512046},
{614249,519196},
{391496,537356},
{62746,626418},
{688215,514806},
{75501,616091},
{883573,505412},
{558824,522910},
{759371,511061},
{173913,573489},
{891351,505089},
{727464,512693},
{164833,576051},
{812317,508529},
{540320,524243},
{698061,514257},
{69149,620952},
{471673,529694},
{159092,577753},
{428134,533653},
{89997,606608},
{711061,513557},
{779403,510081},
{203327,566155},
{798176,509187},
{667688,515963},
{636120,517833},
{137410,584913},
{217615,563034},
{556887,523038},
{667229,515991},
{672276,515708},
{325361,545187},
{172115,573985},
{13846,725685}
};
}
|