USACO 3.1 Humble Numbers

来源:互联网 发布:ug8.0编程视频 编辑:程序博客网 时间:2024/06/04 17:49
#include <stdio.h>#define DEBUG 1#define TESTCASES 9#define MAX_PRIMES 100#define MAX_N 100000//注意别开小了#define INF 0xFFFFFFFFint numOfPrimes, Nth;long long primeArray[MAX_PRIMES + 1];long long humbleArray[MAX_N + 1];//humbleIndex[primeIndex]表示第primeIndex个素数乘以第humbleIndex[primeIndex]个丑数刚好比当前发现的最大丑数humbleArray[numOfHumble]大int humbleIndex[MAX_PRIMES + 1];int main(){#if DEBUGint testCase;for (testCase = 1; testCase <= TESTCASES; testCase++){char inputFileName[20] = "inputX.txt";inputFileName[5] = '1' +  (testCase - 1);freopen(inputFileName, "r", stdin);printf("\n#%d\n", testCase);#endifscanf("%d%d", &numOfPrimes, &Nth);int primeIndex;for (primeIndex = 1; primeIndex <= numOfPrimes; primeIndex++){scanf("%d", &primeArray[primeIndex]);humbleIndex[primeIndex] = 0;}//每一个丑数都是由前面已经较小的丑数乘以某个素数求得,所以可以采用遍历素数再遍历丑数的方法计算,但因为丑数是有序的所以可以记录上次遍历到的丑数的位置/*for each prime pfind the minimum humble number h  such that h * p is bigger than the last humble number.take the smallest h * p found: that's the next humble number.*/humbleArray[0] = 1;int n;long long minNextHumble;long long prime;int minPrimeIndex;for (n = 1; n <= Nth; n++){minNextHumble = INF;for (primeIndex = 1; primeIndex <= numOfPrimes; primeIndex++){prime = primeArray[primeIndex];while (humbleArray[ humbleIndex[primeIndex] ] * prime <= humbleArray[n - 1])humbleIndex[primeIndex]++;if (prime * humbleArray[ humbleIndex[primeIndex] ] < minNextHumble){minNextHumble = prime * humbleArray[ humbleIndex[primeIndex] ];minPrimeIndex = primeIndex;}}humbleArray[n] = minNextHumble;humbleIndex[minPrimeIndex]++;}printf("%d\n", humbleArray[Nth]);#if DEBUG}#endifreturn 0;}


                                             
0 0