题目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. C-数据结构-typedef的用法

    .typedef的用法 # include <stdio.h> typedef int zhang; //为数据类为int从新取名为zhang 等价于int typedef struct ...

  2. UPC-5063-二分图最大匹配

    好吧二分图的最小点覆盖=最大匹配 这道题也就变成模板题了... 写一个提醒,在写二分图时,尽量清零操作清空为-1,比如这个题,匹配数组girl[]如果清空为0,代表每个点都与0点连接,但是实际上是并没 ...

  3. Individual Project - Word_frequency

    0x00 预先准备和时间规划 1.因为要用到visual studio 2013,准备学习C#,预计一天时间能基本使用. 3.了解需求并设计基本数据结构与大致流程 20min 2.根据提议实现simp ...

  4. M1事后分析汇报以及总结

    一.设想和目标 1. 们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是为了提供周边美食和菜谱查询功能,为“吃货”们提供便利.对典型用户和场景有清晰的描 ...

  5. Linux基础实践

    Linux基础实践 1.1 应用安装 要求:掌握软件源的维护方法,配置系统使用软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法 备份原地址列表文件:sudo cp /etc/apt/sou ...

  6. 过滤器Filter的使用(以登录为例子)

    使用过滤器步骤: (1)在web.xml文件中添加过滤器(以下例子是过滤多个请求) <!-- 用户登录过滤 --> <filter> <filter-name>lo ...

  7. yii框架通过IP地址来使用gii

    这里使用的YII框架的版本是2.0.13 详情请参考官方文档:用Gii生成代码 使用gii的主要步骤 1.生成模型(Model Generator) 2.生成CRUD代码 注意点 1.在生成CURD代 ...

  8. linux 终端快捷操作

    终端一些常用快捷键 按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,jobs命令查看后台工作,命令&quo ...

  9. FOJ有奖月赛-2016年8月(daxia专场之过四题方有奖)

    http://acm.fzu.edu.cn/contest/list.php?cid=152 主要是a题, lucas定理, 就这一版能过..  记录一下代码, 另外两个最短路  一个模拟,没什么记录 ...

  10. list1与list2求交集的方法总结!

    一.有序集合求交集的方法有 a)二重for循环法,时间复杂度O(n*n) b)拉链法,时间复杂度O(n) c)水平分桶,多线程并行 d)bitmap,大大提高运算并行度,时间复杂度O(n) e)跳表, ...