您的位置:首页 > 其它

hiho1284:机会渺茫

2017-04-05 11:30 162 查看
hiho144周
时间限制: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


首先:
1、输入N、M,输出表示概率,其实就是在所有的约数的情况下,N、M的相同约数的情况有多少种。
要得到这个输出,首先要知道,N、M的分别的约数个数;
其次要得到约数相同的有多少个;
求约数个数,用平方的方法去求(可以加快时间,原理:因为约数是两两对应的,只有在平方等于总数时,只有一个约数,其余时候都是两个);
约数相同的情况,通过最大公约数的约数个数去求(原理,因为最大公约数的每个约数,都是N、M的共同约数)
最后求得到的两个数的最大公约数,除一下就好了。
本题RE的几个问题:
1、TLE,只得了40分,主要是调用了获取一个数字的约会个数的函数,累加的话效率太低,使用平方的话会减少很多时间。
2、WA,使用了平方后,OJ给我的答复是WA,证明在时间问题上起码我已经达到了题目要求,而WA有分数,说明是后面比较大的数没有通过,所以用了long long作为输入输出类型。
#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

long int GetWordFromInt(long int abc)
{long int count=0;
for (long int i=1;i*i<=abc;i++)
{
if(abc%i==0)
{
count++;
if (i!=abc/i)
{
count ++;
}
}

4000
}
return count ;
}

long int GetOutPut(long int a ,long int b)
{
long int c;
c=a%b;
while (c!=0)
{
a=b;
b=c;
c=a%b;
}
return b;
}
int main()
{
long int a,b;
scanf("%d%d",&a,&b);
long int c,d;
c=GetWordFromInt(a);
d=GetWordFromInt(b);
long int number=GetOutPut(a,b);
long int f=GetWordFromInt(number);
long int under=c*d;
long int divisor=GetOutPut(under,f);
long int outpputOne,outputTwo;
outpputOne=under/divisor;
outputTwo=f/divisor;
printf("%d %d",outpputOne,outputTwo);
return 0;

}

总结:前前后后TLE和WA了几次,用了一个上午,

目前看来自己的基础还是略有欠缺,同时还要开阔自己的思路。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: