方法就是枚举,根据b0和b1可以大大减小枚举范围,方法类似这个http://blog.csdn.net/hehe_54321/article/details/76021615

将b0和b1都分解质因数。记b0的某一质因数x的指数为a,b1中x的指数为b。如果a>b,那么显然对于这组b0和b1不可能有答案;如果a=b,那么ans中的x的指数可以为0到a的任意一个数;如果a<b,那么ans中x的指数只能为b。

举例:

$$
\begin{array}{l|l}
b0=37 & b1=1776 \\
\hline
37 & =37^1*3^0*2^0 \\
ans & =37^x*3^1*2^4 \\
1776 & =37^1*3^1*2^4 \\
\hline
b0=37&b1=1776 \\
96 & =3^1*2^5 \\
ans & =3^2*2^y\\
288 & =3^2*2^5
\end{array}
$$

x表示0-1的任何数,y表示0-5的任何数。这样子就可以得出所有可能的ans,然后再验证其与a0的gcd是否是a1即可。

注意:

1.像我这样写,需要特判1,因为对1分解质因数会得到1,对其他数分解都不会出现这个1。

2.曾经写了假的分解质因数,结果T掉了...真的分解质因数(要打质数表)还是要记一下。

 %:pragma GCC optimize()
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<set>
using namespace std;
typedef int LL;
LL prime[];
bool vis[];
LL ans0[],ans1[];
map<LL,LL> ma;
map<LL,LL>::iterator it;
set<LL>::iterator it2;
set<LL> se;
LL temp[][];
LL size,anss;
LL a0,a1,b0,b1,T;
LL gcd(LL a,LL b)
{
LL t;
while(b!=)
{
t=a;
a=b;
b=t%b;
}
return a;
}
LL pow2(LL x,LL y)
{
LL base=x,ans=;
while(y>)
{
if(y&) ans*=base;
base*=base;
y>>=;
}
return ans;
}
void dprime(LL n,LL ans[])
{
LL i;
LL end=floor(sqrt(n+0.5));
for(i=;prime[i]<=end;i++)
while(n!=prime[i])
{
if(n%prime[i]==)
{
if(ma.count(prime[i])==)
ma[prime[i]]=++size;
ans[ma[prime[i]]]++;
n/=prime[i];
}
else
break;
}
if(ma.count(n)==)
ma[n]=++size;
ans[ma[n]]++;
}
int main()
{ LL ii,i,j,d,dd,d1,d2;
for(i=;i<=;i++)
{
if(!vis[i]) prime[++prime[]]=i;
for(j=;j<=prime[]&&i*prime[j]<=;j++)
{
vis[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
scanf("%d",&T);
while(T--)
{
memset(ans0,,sizeof(ans0));
memset(ans1,,sizeof(ans1));
se.clear();anss=;
ma.clear();size=;
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
dprime(b0,ans0);
dprime(b1,ans1);
if(ma.count()==) ans0[ma[]]=,ans1[ma[]]=;
ii=;
memset(temp[],,sizeof(temp[]));
temp[][]=;
temp[][]=;
for(it=ma.begin();it!=ma.end();it++)
{
ii^=;
memset(temp[ii],,sizeof(temp[ii]));
d=it->second;
dd=it->first;
d1=ans0[d];
d2=ans1[d];
if(d1>d2)
{
puts("");
goto xxx;
}
else if(d1==d2)
{
for(i=;i<=temp[ii^][];i++)
for(j=;j<=d2;j++)
temp[ii][++temp[ii][]]=temp[ii^][i]*pow2(dd,j);
}
else
{
for(i=;i<=temp[ii^][];i++)
temp[ii][++temp[ii][]]=temp[ii^][i]*pow2(dd,d2);
}
}
for(i=;i<=temp[ii][];i++)
se.insert(temp[ii][i]);
for(it2=se.begin();it2!=se.end();it2++)
{
if(gcd(*it2,a0)==a1)
anss++;
}
printf("%d\n",anss);
xxx:;
}
return ;
}

假的分解质因数:

void dprime(int n,int ans[])
{
int i;
for(i=;i<=n;i++)
while(n!=i)
{
if(n%i==)
{
if(ma.count(i)==)
ma[i]=++size;
ans[ma[i]]++;
n/=i;
}
else
break;
}
if(ma.count(n)==)
ma[n]=++size;
ans[ma[n]]++;
}

额外的方法:

设x=a1*a2;a0=a1*a3;x*b2=b1;b0*b3=b1;

则a1*a2*b2=b1

又a1是x和a0的最大公约数,所以a2和a3互质。

又b1是x和b0的最小公倍数,所以b2和b3互质。

所以a2和a0/a1,b2和b1/b0互质。

因为a1*a2*b2=b1

所以a2*b2=b1/a1

因此a2,b2是b1/a1的因子,只需枚举并且判断是否与a3,b3互质即可。

https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P1072

洛谷 P1072 Hankson 的趣味题 || 打质数表的分解质因数的更多相关文章

  1. 洛谷 P1072 Hankson 的趣味题 解题报告

    P1072 \(Hankson\)的趣味题 题目大意:已知有\(n\)组\(a0,a1,b0,b1\),求满足\((x,a0)=a1\),\([x,b0]=b1\)的\(x\)的个数. 数据范围:\( ...

  2. 洛谷P1072 Hankson 的趣味题

    P1072 Hankson 的趣味题 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一 ...

  3. Java实现洛谷 P1072 Hankson 的趣味题

    P1072 Hankson 的趣味题 输入输出样例 输入 2 41 1 96 288 95 1 37 1776 输出 6 2 PS: 通过辗转相除法的推导 import java.util.*; cl ...

  4. 【题解】洛谷P1072 Hankson的趣味题 (gcd和lcm的应用)

    洛谷P1072:https://www.luogu.org/problemnew/show/P1072 思路 gcd(x,a0)=a1 lcm(x,b0)=b1→b0*x=b1*gcd(x,b0) ( ...

  5. 洛谷P1072 Hankson 的趣味题(题解)

    https://www.luogu.org/problemnew/show/P1072(题目传送) 数学的推理在编程的体现越来越明显了.(本人嘀咕) 首先,我们知道这两个等式: (a0,x)=a1,[ ...

  6. 洛谷 P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  7. [NOIP2009] 提高组 洛谷P1072 Hankson 的趣味题

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  8. 洛谷P1072 Hankson的趣味题

    这是个NOIP原题... 题意: 给定 a b c d 求 gcd(a, x) = b && lcm(c, x) = d 的x的个数. 可以发现一个朴素算法是从b到d枚举,期望得分50 ...

  9. 洛谷 - P1072 Hankson - 的趣味题 - 质因数分解

    https://www.luogu.org/problemnew/show/P1072 一开始看了一看居然还想放弃了的. 把 \(x,a_0,a_1,b_0,b_1\) 质因数分解. 例如 \(x=p ...

随机推荐

  1. http权威指南(一)-Http概述

    Http概述 在Web中,不管是浏览器还是server都是通过Http相互通信的.那么Http是怎样工作的呢? 首先,client向server发送Http请求,server会在Http响应中回送所请 ...

  2. 杭电 1596 find the safest road (最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=1596 这道题目与杭电2544最短路的思想是一样的.仅仅只是是把+改成了*,输入输出有些不一样而已. find t ...

  3. IMP-00009 And IMP-00028

    导出文件异常结束” 错误,google一下,发现可能有如下原因导致 1.imp的数据太大,没有写buffer和commit 2.两个数据库字符集不同 3.从低版本exp的dmp文件,向高版本imp 4 ...

  4. sqlldr trailing nullcols

    由于要导入到tmp_content表的一些列(列:要导入的源文件txt or csv文件)为空,也,按理讲我当时另存为(在windows处理)csv,以,分隔.就是这个列没有内容,也该显示, ,之类的 ...

  5. 简说 call() 、apply() 、bind()

    对于这三个方法,我想一部分人还是比较陌生的. 所以今天来个简单的介绍~ 我们可以将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接调用函数.call()和apply()的第一 ...

  6. Linux Linker

    文章原文:http://zhidao.baidu.com/link?url=U2Mtcc6BKi4vuQ1MO8U6s9gNm4y9Epphz03veA2lVpRWMozyVdj0PYvw1ZU9qj ...

  7. react native与原生的交互

    一.交互依赖的重要组件 react native 中如果想要调用ios  中相关的方法,必须依赖一个重要的组件nativemodules import { NativeModules } from ' ...

  8. Oracle:exp导出exp-00091问题

    今天导出一数据库数据,发现EXP-00091问题: 连接到: Oracle Database 10g Enterprise Edition Release - Production With the ...

  9. Codeforces-914F Substrings in a String (Bitset求T串中S串出现次数)

    之前有过区域赛,简化版问题: 给定一个小写字符组成的字符串S,(|S|<1e5,下标从1开始),现在有Q种操作,对于每个操作Q(Q<=1e5),输入opt, 如果opt==1,输入x,c, ...

  10. DPI和PPI

    写在前面 各种手机测频机构或者相关资讯老是谈及一个概念:ppi和dpi,通常总会忽略,只是稍微明白,这参数越高,说明屏幕分辨率越高:很长时间都止步如此:但作为一个iOS开发者,岂能止步如此,万一别人问 ...