hiho一下 第144周(机会渺茫)解题报告及拓展
题目1 : 机会渺茫
描述
小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周(机会渺茫)解题报告及拓展的更多相关文章
- hiho一下 第144周
题目1 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求: ...
- 【hiho一下 第144周】机会渺茫
[题目链接]:http://hihocoder.com/contest/hiho144/problem/1 [题意] [题解] 找出两个数相同的因子的个数x 然后两个数各自的因子的个数numa,nub ...
- hiho #1284 机会渺茫
#1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要 ...
- hihoCoder1284机会渺茫(唯一分解定理 + 约分)
题目链接 #1284 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出 ...
- 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point
// 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...
- hiho一下 第115周:网络流一•Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)
来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快. hi ...
- hihocoder-1284 机会渺茫(水题)
机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求:对于给定的两 ...
- 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】
目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...
- 2011 ACM-ICPC 成都赛区解题报告(转)
2011 ACM-ICPC 成都赛区解题报告 首先对F题出了陈题表示万分抱歉,我们都没注意到在2009哈尔滨赛区曾出过一模一样的题.其他的话,这套题还是非常不错的,除C之外的9道题都有队伍AC,最终冠 ...
随机推荐
- LInux下设置账号有效时间 以及 修改用户名(同时修改用户组名和家目录)
在linux系统中,默认创建的用户的有效期限都是永久的,但有时候,我们需要对某些用户的有效期限做个限定!比如:公司给客户开的ftp账号,用于客户下载新闻稿件的.这个账号是有时间限制的,因为是付费的.合 ...
- 一个数据表通过另一个表更新数据(在UPDAT语句中使用FROM子句)
在sql server中,update可以根据一个表的信息去更新另一个表的信息. 首先看一下语法: update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHE ...
- 归并排序O(nlogn)
先分治再合并 代码 #include<bits/stdc++.h> using namespace std; #define ll long long int a[1000],t[1000 ...
- 基于SSH框架的考勤管理系统的设计与实现
基于SSH框架的考勤管理系统的设计与实现
- WIFI探针技术
1.WIFI 探针定义 WIFI 探针是一种能够主动识别 Android 和 IOS 设备,感知用户行为轨迹的精准数据收集前端,基于 WIFI探测技术.移动互联网和云计算等先进技术自动识别探针附近的智 ...
- 用软件工程分析开源项目octave的移植
在本科的时候学习了软件工程,报考了信息系统项目管理师的考试,,虽然没有过,但是其实还是学了一些相关项目管理方面的知识,,9大管理,,当年应该能背出来,,, 1 项目整体管理 2 项目范围管理 3 项目 ...
- 2017BUAA软工第0次作业
第一部分:结缘计算机 1. 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 我在上大学之前,其实一直就没怎么考虑过自己以后想要选什么专业,只知道一个大致的方向一定是理工科.毕竟大学之前, ...
- 使用phpstudy创建本地虚拟主机
在使用php开发网站的时候,每次测试自己的网站时,通常都是用localhost/dirname/filename.php来访问自己所写的程序 但是有时候我们需要模拟真实的场景,如通过域名访问时,如果你 ...
- 文本文件合并(C++实现)
直接附上代码吧 #include<iostream> #include<fstream> #include<cstdlib> using namespace std ...
- PAT 1002 写出这个数
https://pintia.cn/problem-sets/994805260223102976/problems/994805324509200384 读入一个自然数n,计算其各位数字之和,用汉语 ...