机会渺茫

题目来源:

http://hihocoder.com/contest/hiho144/problem/1

题目1 : 机会渺茫

时间限制: 5000ms
单点时限: 1000ms
内存限制: 256MB

描述

小Hi最近在追求一名学数学的女生小Z。小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两个正整数N和M,小Hi随机选取一个N的约数N',小Z随机选取一个M的约数M',如果N'和M'相等,她就答应小Hi。

小Z让小Hi去编写这个随机程序,到时候她review过没有问题了就可以抽签了。但是小Hi写着写着,却越来越觉得机会渺茫。那么问题来了,小Hi能够追到小Z的几率是多少呢?

输入

每个输入文件仅包含单组测试数据。

每组测试数据的第一行为两个正整数N和M,意义如前文所述。

对于40%的数据,满足1<=N,M<=106

对于100%的数据,满足1<=N,M<=1012

输出

对于每组测试数据,输出两个互质的正整数A和B(以A分之B表示小Hi能够追到小Z的几率)。

样例输入
3 2
样例输出
4 1
#include 
#include
#include

using namespace std;

typedef struct metadata
{
    long long value;
    struct metadata * next;
} Metadata;


struct metadata * a_head;
struct metadata * b_head;
///计算因子
int cal_divisor(long long data,struct metadata * point)
{
    if(data==1)
        return 1;
    struct metadata *temp;
    temp=point;
    long long i=2;
    int cnt=1;
   // cout<<"1 ";
    long long l_data=data;
    while(ivalue=i;
            node->next=NULL;
            temp->next=node;
            temp=node;

            if(l_data!=i)
            {
               // cout<value=l_data;
                node2->next=NULL;
                temp->next=node2;
                temp=node2;
                cnt=cnt+2;
            }
            else
            {
                cnt++;
            }
        }
        i++;
    }
    struct metadata * node;
    node=(struct metadata *)malloc(sizeof(struct metadata));
    node->value=data;
    node->next=NULL;
    temp->next=node;
    temp=node;
    cnt++;
    //cout<value<<" ";
        a_temp=a_temp->next;
    }
    //cout<value<<" ";
        struct metadata *temp;
        temp=b_temp;
        while(temp!=NULL)
        {
            if(a_temp->value==temp->value)
            {
               // cout<value<<"--> ";
                temp->value=0;
                cnt++;
                //temp=temp->next;
                break;
            }
            else
            {
                temp=temp->next;
            }
        }
        b_temp=b_point;
        a_temp=a_temp->next;
    }
   // cout<value=i;
            node->next=NULL;

            temp->next=node;
            temp=node;
        }
    }
   // cout<value=1;
    p_a->next=NULL;
    cal_divisor_result(output[0],p_a);

    p_b=(struct metadata *)malloc(sizeof(struct metadata));
    p_b->value=1;
    p_b->next=NULL;
    cal_divisor_result(output[1],p_b);

    p_c=(struct metadata *)malloc(sizeof(struct metadata));
    p_c->value=1;
    p_c->next=NULL;

    struct metadata * c_temp;
    struct metadata * a_temp;
    struct metadata * b_temp;

    a_temp=p_a;
    b_temp=p_b;
    c_temp=p_c;
   // cout<<"约数有:";
    while(a_temp!=NULL && b_temp!=NULL)
    {
        if(a_temp->value==b_temp->value)
        {
           // cout<value<<" ";
            struct metadata * node;
            node=( struct metadata * )malloc(sizeof( struct metadata));
            node->value=a_temp->value;
            node->next=NULL;
            c_temp->next=node;
            c_temp=node;

            a_temp=a_temp->next;
            b_temp=b_temp->next;
        }
        else if(a_temp->value > b_temp->value)
        {
            b_temp=b_temp->next;
        }
        else
        {
            a_temp=a_temp->next;
        }
    }
   // cout<<"结束"<next;
    while(c_temp!=NULL)
    {
       // cout<value<<" ";
        c_temp=c_temp->next;
    }
    c_temp=p_c->next;
    while(c_temp!=NULL)
    {
        if(c_temp->value==1)
            c_temp=c_temp->next;
        else if((output[0]%c_temp->value==0) && (output[1]%c_temp->value==0))
        {
            output[1]=output[1]/c_temp->value;
            output[0]=output[0]/c_temp->value;
        }
        else
            c_temp=c_temp->next;
    }
    //cout<>a>>b)
    {
        a_head=(struct metadata *)malloc(sizeof(struct metadata));
        a_head->next=NULL;
        a_head->value=1;

        b_head=(struct metadata *)malloc(sizeof(struct metadata));
        b_head->next=NULL;
        b_head->value=1;

        final_result(a,b);

        struct metadata * temp;
        temp=a_head;
        while(temp!=NULL)
        {
            a_head=temp->next;
            free(temp);
            temp=a_head;
        }
        temp=b_head;
        while(temp!=NULL)
        {
            b_head=temp->next;
            free(temp);
            temp=b_head;
        }
    }
}

int main()
{
    test();
    return 0;
}


结果:Accepted 

得分: 100 / 100






你可能感兴趣的:(CC++)