Time Limit:1s Memory Limit:10000k
Total Submit:3112 Accepted:1109
下载样例程序(PE)
下载样例程序(ELF)
Problem
我们定义一个函数H(p1, p2, p3,i)(i=1,2,3....),p1,p2,p3为互不相同的素数,当p1,p2,p3固定不变时。
对于所有i,它的值的因子只能在p1,p2,p3当中。i表示将此序列递增排序后的第i个数。
例如 p1=2,p2=3,p3=5,序列为 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, ...
H(2, 3, 5,5)=6.
Input
该题有多组测试数据,每组测试数据有4个整数p1,p2,p3,i。
Output
输出函数值。注:该题所有输入输出均小于10^9。
Sample Input
2 3 5 5
Sample Output
6
C的解答和结果
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX_VALUE (1000000000L)
struct Node{
struct Node* next;
unsigned int value;
};
int GetLength(int value)
{
int result = 1;
while(value >= 10){
result++;
value /= 10;
}
return result;
}
int main()
{
int p1, p2, p3, i;
int a, b, c;
int k1, k2, k3;
unsigned int t1[30], t2[30], t3[30];
unsigned int temp, temp2;
struct Node header, *p, *q, *node;
while(scanf("%d%d%d%d", &p1, &p2, &p3, &i) > 0){
if(p1 < p2){
a = p1;
c = p2;
}else{
a = p2;
c = p1;
}
if(p3 < a) a = p3;
if(p3 > c) c = p3;
if(p1 != a && p1 != c) b = p1;
if(p2 != a && p2 != c) b = p2;
if(p3 != a && p3 != c) b = p3;
p1 = a; p2 = b; p3 = c;
memset(t1, 0, sizeof(t1));
memset(t2, 0, sizeof(t2));
memset(t3, 0, sizeof(t3));
temp = 1; t1[0] = 1;
for(k1 = 0; k1 < sizeof(t1); k1++){
t1[k1] = temp;
temp *= p1;
if(temp > MAX_VALUE) break;
if(temp < 0) break;
}
temp = 1; t2[0] = 1;
for(k2 = 0; k2 < sizeof(t2); k2++){
t2[k2] = temp;
temp *= p2;
if(temp > MAX_VALUE) break;
if(temp < 0) break;
}
temp = 1; t3[0] = 1;
for(k3 = 0; k3 < sizeof(t3); k3++){
t3[k3] = temp;
temp *= p3;
if(temp > MAX_VALUE) break;
if(temp < 0) break;
}
header.next = NULL;
for(a = 0; a <= k3; a++){
for(b = 0; b <= k2; b++){
temp2 = t3[a] * t2[b];
if(temp2 > MAX_VALUE) break; //如何判断两个大整数相乘后溢出?
if(temp2 % t3[a] != 0) break;
for(c = 0; c <= k1; c++){
temp = temp2 * t1[c];
if(temp == 1) continue;
if(temp > MAX_VALUE) break;
if(temp % t1[c] != 0) break;
p = header.next; q = &header;
while(p && p->value < temp){
q = p;
p = p->next;
}
node = malloc(sizeof(struct Node));
node->value = temp;
node->next = p;
q->next = node;
}
}
}
p = header.next;
i--;
while(i-- && p){
p = p->next;
}
if(p) printf("%d/n", p->value);
else printf("%d/n", MAX_VALUE);
p = header.next;
while(p){
q = p->next;
free(p);
p = q;
}
}
return 0;
}
Memory: 164K
Time: 10ms