题目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

Solution:

Way1:

 #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> long ans=,maxn,zhi[]; void Get_Zhi()
{
long i,j;
bool vis[maxn+];
for (i=;i<=maxn;i++)
vis[i]=true;
for (i=;i<=maxn;i++)
{
if (vis[i])
{
ans++;
zhi[ans]=i;
}
for (j=;j<=ans;j++)
{
if (i*zhi[j]>maxn)
break;
vis[i*zhi[j]]=false;
if (i%zhi[j]==)
break;
}
}
} int main()
{
long long n,m,a,b,temp,x,y;
long i,g;
scanf("%lld%lld",&n,&m);
if (n>m)
maxn=(long)sqrt(n);
else
maxn=(long)sqrt(m);
Get_Zhi();
if (n>m)
{
a=n;
b=m;
}
else
{
a=m;
b=n;
}
while (b)
{
temp=b;
b=a%b;
a=temp;
}
x=;
y=;
//a
if (a!=)
{
for (i=;i<=ans;i++)
if (a%zhi[i]==)
{
g=;
while (a%zhi[i]==)
{
a/=zhi[i];
g++;
}
x*=g;
if (a==)
break;
}
//a,n,m都有该质数,且系数都为1(若系数大于1,则相乘大于最大值)
if (a!=)
{
//x*2,y*4->x,y*2
y*=;
n/=a;
m/=a;
}
} //n
if (n!=)
{
for (i=;i<=ans;i++)
if (n%zhi[i]==)
{
g=;
while (n%zhi[i]==)
{
n/=zhi[i];
g++;
}
y*=g;
if (n==)
break;
}
if (n!=)
y*=;
} //m
if (m!=)
{
for (i=;i<=ans;i++)
if (m%zhi[i]==)
{
g=;
while (m%zhi[i]==)
{
m/=zhi[i];
g++;
}
y*=g;
if (m==)
break;
}
if (m!=)
y*=;
} a=y;
b=x;
while (b)
{
temp=b;
b=a%b;
a=temp;
}
x/=a;
y/=a;
printf("%lld %lld\n",y,x);
return ;
}

Way2:

 #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> long ans=,maxn,zhi[]; //打质数表! void Get_Zhi()
{
long i,j;
bool vis[maxn+];
for (i=;i<=maxn;i++)
vis[i]=true;
for (i=;i<=maxn;i++)
{
if (vis[i])
{
ans++;
zhi[ans]=i;
}
for (j=;j<=ans;j++)
{
if (i*zhi[j]>maxn)
break;
vis[i*zhi[j]]=false;
if (i%zhi[j]==)
break;
}
}
} int main()
{
long long n,m,y=;
long i,j,g1=,g2=,p[],q[],u[],v[];
scanf("%lld%lld",&n,&m);
if (n>m)
maxn=(long)sqrt(n);
else
maxn=(long)sqrt(m);
Get_Zhi(); //n
if (n!=)
{
for (i=;i<=ans;i++)
if (n%zhi[i]==)
{
g1++;
p[g1]=i;
q[g1]=;
while (n%zhi[i]==)
{
n=n/zhi[i];
q[g1]++;
}
if (n==)
break;
}
}
if (n!=)
y*=; //m
if (m!=)
{
for (i=;i<=ans;i++)
if (m%zhi[i]==)
{
g2++;
u[g2]=i;
v[g2]=;
while (m%zhi[i]==)
{
m/=zhi[i];
v[g2]++;
}
if (m==)
break;
}
}
if (m!= && m!=n)
y*=;
i=;
j=;
while (i<=g1 && j<=g2)
{
if (p[i]<u[j])
{
y*=q[i];
i++;
}
else if (u[j]<p[i])
{
y*=v[j];
j++;
}
else
{
if (q[i]>v[j])
y*=q[i];
else
y*=v[j];
i++;
j++;
}
}
while (i<=g1)
{
y*=q[i];
i++;
}
while (j<=g2)
{
y*=v[j];
j++;
}
printf("%lld 1\n",y);
return ;
}

Way3:

 #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> long ans=,maxn,zhi[]; void Get_Zhi()
{
long i,j;
bool vis[maxn+];
for (i=;i<=maxn;i++)
vis[i]=true;
for (i=;i<=maxn;i++)
{
if (vis[i])
{
ans++;
zhi[ans]=i;
}
for (j=;j<=ans;j++)
{
if (i*zhi[j]>maxn)
break;
vis[i*zhi[j]]=false;
if (i%zhi[j]==)
break;
}
}
} int main()
{
long long n,m,a,b,temp,x,y;
long g,i,r=,t,p[],q[];
scanf("%lld%lld",&n,&m);
if (n>m)
maxn=(long)sqrt(n);
else
maxn=(long)sqrt(m);
Get_Zhi();
if (n>m)
{
a=n;
b=m;
}
else
{
a=m;
b=n;
}
while (b)
{
temp=b;
b=a%b;
a=temp;
}
x=;
y=; n/=a;
m/=a; //a
r=;
if (a!=)
{
for (i=;i<=ans;i++)
if (a%zhi[i]==)
{
r++;
p[r]=i;
q[r]=;
while (a%zhi[i]==)
{
a/=zhi[i];
q[r]++;
}
x*=q[r];
if (a==)
break;
}
//a,n,m都有该质数,且系数都为1(若系数大于1,则相乘大于最大值)
//x*2,y*4->x,y*2
if (a!=)
y*=;
}
p[r+]=; //n
if (n!=)
{
t=;
for (i=;i<=ans;i++)
if (n%zhi[i]==)
{
g=;
while (n%zhi[i]==)
{
n/=zhi[i];
g++;
}
//p[r+1]=1000000;
while (p[t]<i)
{
y*=q[t];
t++;
}
if (p[t]==i)
{
y*=(g+q[t]-);
t++;
}
else
y*=g;
if (n==)
break;
}
if (n!=)
y*=;
while (t<=r)
{
y*=q[t];
t++;
}
}
else
y*=x; //m
if (m!=)
{
t=;
for (i=;i<=ans;i++)
if (m%zhi[i]==)
{
g=;
while (m%zhi[i]==)
{
m/=zhi[i];
g++;
}
//p[r+1]=1000000;
while (p[t]<i)
{
y*=q[t];
t++;
}
if (p[t]==i)
{
y*=(g+q[t]-);
t++;
}
else
y*=g;
if (m==)
break;
}
if (m!=)
y*=;
while (t<=r)
{
y*=q[t];
t++;
}
}
else
y*=x; a=y;
b=x;
while (b)
{
temp=b;
b=a%b;
a=temp;
}
x/=a;
y/=a;
printf("%lld %lld\n",y,x);
return ;
}
/*
input:
16 8
output:
5 1 input:
60 48
output:
20 1
*/

Advance:

 #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxn 100000
#define maxs 100000 long zhi[maxn],z[maxs+][],g[maxs+][],ansz[maxs+]; void Get_Zhi()
{
long i,j,s,ans=;
long long k;
bool vis[maxn+];
for (i=;i<=maxn;i++)
vis[i]=true;
for (i=;i<=maxn;i++)
{
if (vis[i])
{
ans++;
zhi[ans]=i;
for (j=i;j<=maxs;j+=i)
{
ansz[j]++;
z[j][ansz[j]]=i;
//为了求约数总数,比正确个数多1
g[j][ansz[j]]=;
}
k=(long long)i*i;
s=;
while (k<=maxs)
{
for (j=k;j<=maxs;j+=k)
g[j][ansz[j]]++;
k=(long long)k*i;
s++;
}
}
for (j=;j<=ans;j++)
{
if (i*zhi[j]>maxn)
break;
vis[i*zhi[j]]=false;
if (i%zhi[j]==)
break;
}
}
} int main()
{
long i,j,m,n;
double result=,re;
for (i=;i<=maxs;i++)
ansz[i]=;
Get_Zhi();
for (n=;n<=maxs;n++)
for (m=;m<=maxs;m++)
{
re=1.0;
i=;
j=;
while (i<=ansz[n] && j<=ansz[m])
{
if (z[n][i]<z[m][j])
{
re/=g[n][i];
i++;
}
else if (z[n][i]>z[m][j])
{
re/=g[m][j];
j++;
}
else
{
if (g[n][i]>g[m][j])
re/=g[n][i];
else
re/=g[m][j];
i++;
j++;
}
}
while (i<=ansz[n])
{
re/=g[n][i];
i++;
}
while (j<=ansz[m])
{
re/=g[m][j];
j++;
}
result+=re;
}
printf("%lf\n",result*1.0/maxs/maxs);
return ;
}

hiho一下 第144周(机会渺茫)解题报告及拓展的更多相关文章

  1. hiho一下 第144周

    题目1 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求: ...

  2. 【hiho一下 第144周】机会渺茫

    [题目链接]:http://hihocoder.com/contest/hiho144/problem/1 [题意] [题解] 找出两个数相同的因子的个数x 然后两个数各自的因子的个数numa,nub ...

  3. hiho #1284 机会渺茫

    #1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要 ...

  4. hihoCoder1284机会渺茫(唯一分解定理 + 约分)

    题目链接 #1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出 ...

  5. 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point

    // 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...

  6. hiho一下 第115周:网络流一•Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)

    来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快.   hi ...

  7. hihocoder-1284 机会渺茫(水题)

    机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两 ...

  8. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

  9. 2011 ACM-ICPC 成都赛区解题报告(转)

    2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠 ...

随机推荐

  1. ACM注意事项

           acm竞赛中不能使用一些屏幕控制和键盘读取的函数,如:getch(),geche(),gotoxy(),clrscr(),另外fflush(stdio)这个函数也不能使用,因为在有的编译 ...

  2. OneZero第一次随感

    >本人基础薄弱,有幸加入这个团队,甚感欣慰.这是本人第一次尝试写博客,说实话,胆怯.因为能力有限,怕技能匮乏,说不好.但是我知道既然加入这个团队,就要为团队负责.万事开头难,过程也挺难(就我个人 ...

  3. Microsoft Visual Studio 2013安装及试用

    我是在网上下载的vs2013版的安装包,下载的是压缩文件,解压后是2.86GB.安装包下载完成后我们就可以进入安装了. 同时建议最好在互联网连接的情况下安装. 打开下载好的文件,我们要选择.exe可执 ...

  4. 基于SSH的高校网上选课系统的质量属性的实现

    我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误 ...

  5. 第三次Sprint

    Not CHECKED OUT CHECKED OUT DONE!: SPRINT GOAL: BETA-READY 修改bug 完善界面

  6. 我的software

    每个学计算机软件的同学都有可能经历以下的情况: 1.  哎,我家电脑开不了机了,来帮帮忙 2.  我耳机坏了,你给修修吧 3.  你能换手机屏不 4.  过来看下,我的Word打不开了 等等等等 这些 ...

  7. node的consoidate的插件统一

    使用consolidate.ejs.的这种形式. let express = require('express'); let app = express(); app.set('views','返回的 ...

  8. java基础知识点罗列

    1:Java泛型 2:clone Java中的深拷贝(深复制)和浅拷贝(浅复制)   Java中对Clone的理解  序列化和反序列化的概念 3:Java中有关Null的9件事

  9. [CB]2018年中国智能手机市场出货量

    Canalys:2018年中国智能手机市场出货量同比跌逾14% https://www.cnbeta.com/articles/tech/813267.htm 市场调研机构Canalys今日公布中国智 ...

  10. file_put_contents () failed to open stream: Permission denied 解决办法

    今天,帮朋友配置服务器thinkphp5的时候,直接访问“www.***.com/admin/index/index” : 出现以下错误: file_put_contents (/PHP/admin/ ...