序列函数

来源:互联网 发布:tizen软件 编辑:程序博客网 时间:2024/05/21 17:00
序列函数

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