可能我只适合这道题的50分

但还是要争取一下的

我们知道对于\(gcd\)和\(lcm\)有这样的定义

\(a=\prod _{i=1}^{\pi(a)}p_i^{d_{i}}\)

\(b=\prod _{i=1}^{\pi(b)}p_i^{g_{i}}\)

那么则有

\(gcd(a,b)=\prod_{i=1}^{\pi(max(a,b))} p_i^{min(g_i,d_i)}\)

\(lcm(a,b)=\prod_{i=1}^{\pi(max(a,b))} p_i^{max(g_i,d_i)}\)

把上面的式子翻译成汉语就是

如果我们将\(a,b\)质因数分解,那么对于\(a,b\)所有同一个质因子,指数较小的相乘得到的就是\(gcd(a,b)\),指数较大的相乘得到的就是\(lcm(a,b)\)

比如说\(12,8\)吧

我们分解质因数

\(12=2^2*3^1\)

\(8=2^3\)

所以\(gcd(12,8)=2^{min(2,3)}*3^{min(1,0)}=2^2=4\)

\(lcm(12,8)=2^{max(2,3)}*3^{max(1,0)}=2^3*3^1=24\)

于是有了这个性质,我们做这道题就比较简单了

那我们的核心就是把\(a0,a1,b0,b1\)都分解质因数

之后对于相同的质因子我们都要讨论一下他的指数,来推出\(x\)的指数

如果有解的话,这个指数必定是一个范围,所以我们可以求出每个指数的范围之后乘法原理得出答案

如果无解我们就中途判断推出就好了

但是还有一个问题,我们分解质因数的话应该怎么分解,分解到一个什么范围

我们知道整数还有一个一个性质:每个整数\(n\)至多有一个大于\(\sqrt{n}\)的质因子

尽管这里的数都很大,小于等于\(2E9\)但是我们只需要筛出\(1\)到\(\sqrt{2E9}\)之间的质数,剩下的那个质因子我们特判就可以了

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<bitset>
  5. #define LL long long
  6. #define re register
  7. #define maxn 50005
  8. using namespace std;
  9. int T;
  10. int p[maxn],tot;
  11. bitset<maxn> f;
  12. LL a0,a1,b0,b1;
  13. inline LL read()
  14. {
  15. char c=getchar();
  16. LL x=0;
  17. while(c<'0'||c>'9') c=getchar();
  18. while(c>='0'&&c<='9')
  19. x=(x<<3)+(x<<1)+c-48,c=getchar();
  20. return x;
  21. }
  22. int main()
  23. {
  24. T=read();
  25. f[1]=1;
  26. for(re int i=2;i<=maxn-5;i++)
  27. {
  28. if(!f[i]) p[++tot]=i;
  29. for(re int j=1;j<=tot&&p[j]*i<=maxn-5;j++)
  30. {
  31. f[p[j]*i]=1;
  32. if(i%p[j]==0) break;
  33. }
  34. }//欧拉筛,由于sqrt(2000000000)大概为45000,所以筛到50000就可以了
  35. while(T--)
  36. {
  37. LL ans=1;
  38. int flag=0;
  39. a0=read();
  40. a1=read();
  41. b0=read();
  42. b1=read();
  43. for(re int i=1;i<=tot;i++)
  44. {
  45. if(a0==1&&a1==1&&b0==1&&b1==1) break;
  46. int num1=0,num2=0,num3=0,num4=0;
  47. while(a0%p[i]==0) num1++,a0/=p[i];
  48. while(a1%p[i]==0) num2++,a1/=p[i];
  49. while(b0%p[i]==0) num3++,b0/=p[i];
  50. while(b1%p[i]==0) num4++,b1/=p[i];
  51. //统计这个质因子对应的指数应该是多少
  52. if(num1<num2||num3>num4) //如果这个a0质因子的指数小于a1的,那么就无解,因为a1的指数应该是最小的
  53. //如果这个b0质因子的指数大于b1的,那么就无解,因为b1的指数应该是最大的
  54. {
  55. flag=1;
  56. break;
  57. }
  58. if(num3<num4)
  59. //如果b0的指数小于b1的,说明x此时的指数应该为num4,所以此时对答案没有贡献,判断是否有解之后退出
  60. {
  61. if(min(num4,num1)!=num2)
  62. {
  63. flag=1;
  64. break;
  65. }
  66. continue;
  67. }
  68. if(num1>num2)
  69. //如果a0的指数大于a1的,说明x此时的指数应该为num2,所以此时对答案没有贡献,判断是否有解之后退出
  70. {
  71. if(max(num2,num3)!=num4)
  72. {
  73. flag=1;
  74. break;
  75. }
  76. continue;
  77. }
  78. if(num3<num1)
  79. {
  80. flag=1;
  81. break;
  82. }
  83. ans=ans*(num3-num1+1);
  84. }
  85. if(!flag&&(a1!=1||a0!=1||b0!=1||b1!=1))
  86. {
  87. if(a1>a0) flag=1;
  88. if(b1<b0) flag=1;
  89. if(b1==b0&&b1!=1) ans<<=1;
  90. }
  91. if(!flag) cout<<ans<<endl;
  92. else puts("0");
  93. }
  94. }

【Hankson 的趣味题】的更多相关文章

  1. 算法训练 Hankson的趣味题

    算法训练 Hankson的趣味题   时间限制:1.0s   内存限制:64.0MB        问题描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Han ...

  2. 1172 Hankson 的趣味题[数论]

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descrip ...

  3. 1172 Hankson 的趣味题

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Descrip ...

  4. Codevs 1172 Hankson 的趣味题 2009年NOIP全国联赛提高组

    1172 Hankson 的趣味题 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Hanks 博 ...

  5. 一本通1626【例 2】Hankson 的趣味题

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

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

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

  7. CH3201 Hankson的趣味题

    题意 3201 Hankson的趣味题 0x30「数学知识」例题 描述 Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson ...

  8. luogu P1072 Hankson的趣味题

    题目链接 luogu P1072 Hankson 的趣味题 题解 啊,还是noip的题好做 额,直接推式子就好了 \(gcd(x,a_0)=a_1=gcd(\frac{x}{a_1},\frac{a_ ...

  9. 洛谷P1072 Hankson 的趣味题

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

  10. NOIP 2009 Hankson 的趣味题

    洛谷 P1072 Hankson 的趣味题 洛谷传送门 JDOJ 1648: [NOIP2009]Hankson的趣味题 T2 JDOJ传送门 Description Hanks 博士是BT (Bio ...

随机推荐

  1. C# [method Modifiers] abstract virtual override new

    abstract :表示方法是抽象方法,在子类中必须重写.抽象方法所在的类必须是抽象类,即用abstract modifiers:virtual:表示此方法是virtual方法,除了在子类中可以重写外 ...

  2. Asp.net core如何使用Session

    转自:https://tahirnaushad.com/2017/08/18/asp-net-core-session-state/ Asp.net core使用session: 在nuget 安装M ...

  3. 自定义控件实现-今日头条Android APP图集效果

    前提 产品有个新需求,类似今日头条的图集效果 大致看了下UI,大致就是ViewPager,横向滑动切换图片,纵向滑动移动图片,纵向超过一定距离,图片飞出,图集淡出动画退出,支持图片的双击放大. 思路 ...

  4. html元素 input各种输入限制

    1.取消按钮按下时的虚线框,在input里添加属性值 hideFocus 或者 HideFocus=true <input type="submit" value=" ...

  5. 单例模式的c++实现

    #pragma once #include <iostream> #include <memory> #include <Windows.h> using name ...

  6. svn 未提交的显示黑色的星*

    1.在eclipse中,选择window-->Preferences,里面找到svn,如下图,勾选上Outgoing changes即可

  7. javascript获取元素样式值

    使用css控制页面有4种方式,分别为行内样式(内联样式).内嵌式.链接式.导入式. 行内样式(内联样式)即写在html标签中的style属性中,如<div style="width:1 ...

  8. Unicode汉字转码小工具

    点击按钮即可使用! 在这里粘贴或输入       转换结果:

  9. webapi datetime类型序列化成json带T且时间不对问题的解决

    在global.asax.cs里加入如下代码: protected void Application_Start() { GlobalConfiguration.Configuration.Forma ...

  10. vue支付密码

    从网上搜索了好多都很麻烦,花了点事件自己做了个,简单轻便,老少皆宜 <template> <section class="pay-mask" @click=&qu ...