题目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. Dethe is my Finaunce金融

    英国诗人乔叟Dethe is my Finaunce金融 英语中“金融”在14世纪,金融计算时间价值的手段.就随机结果签约的能力.一个允许转让金融权后的清算.<Lamentation of Ma ...

  2. Mac下通过VMware Fusion安装centos虚拟机操作记录

    下面介绍下利用VMware Fusion工具在Mac上安装centos虚拟机的做法:1)下载VMware Fusion工具下载地址(包括注册码):http://www.macx.cn/thread-2 ...

  3. 手动编写的几个简单的puppet管理配置

    puppet在自动化配置管理方面有很强大的优势,这里就不做过多介绍了,下面记录下几个简单的puppet管理配置: 一.首先在服务端和客户端安装puppet和facter 1)服务端 安装Puppet ...

  4. 小学四则运算APP 第三阶段冲刺-第一天

    团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第三次冲刺阶段时间:12.12~12.19 本次发布的是音乐播放功能,可以根据用户需求一边播放音乐一边做题,也拥有暂停播放音乐的功能,增强 ...

  5. SDN网络虚拟化、资源映射等相关论文粗读

    1. Control Plane Latency with SDN Network Hypervisors: The Cost of Virtualization 年份:2016 来源:IEEE NE ...

  6. CodeIgniter 2.x和3.x修改默认控制器问题解答

    首先明确一点,CodeIgniter框架的2.x和3.x版本中修改默认控制器是有一点区别的 但相同的操作都是修改application/config/routes.php $route['defaul ...

  7. HDU 1236 排名(Microsoft_zzt)

    http://acm.hdu.edu.cn/showproblem.php?pid=1236 Problem Description 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完 ...

  8. [转帖]关于hostnamectl 命令

    作者:Linux运维 来源:CSDN 原文:https://blog.csdn.net/linuxnews/article/details/51112022 版权声明:本文为博主原创文章,转载请附上博 ...

  9. Oracle的简单的创建dblink以及进行数据迁移的方法

    1. 创建dblink 语法如下: create public database link zhaobsh connect to lcoe739999 identified by Test6530 u ...

  10. loadrunner基础学习笔记五-场景

    场景目标:模拟10家旅行社同时登录.搜索航班.购买机票.查看航班路线并退出 负载测试是指在典型工作条件下测试应用程序,例如:多家旅行社同时在同一个机票预订系统中预订机票 controller提供所有用 ...