连续三次不开longlong导致wa!!!

不开longlong一时爽,一会提交火葬场!!!

OI千万条,longlong第一条

乘法不longlong,提交两行泪

暴力luogu就能过了???打好暴力的重要性!!!(事实上只能拿90分)

1.暴力

根据lcm(x,b0)==b1可以发现x一定是b1的约数,所以枚举用试除法b1的约数,暴力判断是否符合条件

(数学题发现性质的重要性

复杂度O(n*sqrt(b1)*log(b1)),预处理出1~sqrt(2*1e9)的所有质数,用搜索组成d的所有约数,在判断是否满足可过

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. ll aa,ba,ab,bb,ans;
  5. inline ll gcd(ll a,ll b){
  6. return b?gcd(b,a%b):a;
  7. }
  8. inline ll lcm(ll a,ll b){
  9. return a*b/gcd(a,b);
  10. }
  11. void div(ll n){
  12. for(int i=;i*i<=n;i++){
  13. if(n%i==){
  14. ll g=gcd(i,aa),l=lcm(i,ba);
  15. if(g==ab && l==bb)ans++;
  16. if(n/i!=i){
  17. ll g=gcd(n/i,aa),l=lcm(n/i,ba);
  18. if(g==ab && l==bb)ans++;
  19. }
  20. }
  21. }
  22. }
  23. int main(){int T;
  24. scanf("%d",&T);
  25. while(T--){
  26. ans=;
  27. scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
  28. div(bb);
  29. printf("%lld\n",ans);
  30. }
  31. }

2.正解

因为x是b1的约数,所以x的质因子一定是b1的质因子。可以对b1的每个质因子p,计算x可能包含多少个p。

设a0,a1,b0,b1,x有质因子p个数为ma0,ma1,mb0,mb1,mx,mx未知

思考可以得出:

对于gcd(x,a0)=a1:

(1)若ma0>ma1,则mx只能等于ma1

(2)若ma0==ma1,则只需满足mx>=ma1

(3)若ma0<ma1,无解

对于lcm(x,b0)=b1:

(1)若mb0<mb1,mx只能等于mb1

(2)若mb0==mb1,只需满足mx<=mb1

(3)若mb0>mb1,无解

综合分类讨论(恶心),其他情况组合判断即可

对于ma0==ma1 && mb0==mb1的情况,只要保持在ma1<=mx<=mb1的范围内取值即可,共有md-mc+1种取法

每个质因子都是相对独立的,根据乘法原理,总取值即为每次的答案相乘。

预处理出1~sqrt(1e9)中的素数,若b1为质数,那么直接计算有质因子b1的个数即可

复杂度O(n*sqrt(b1)/ log(b1))

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. //±©Á¦£º
  5. //ll aa,ba,ab,bb,ans;
  6. //inline ll gcd(ll a,ll b){
  7. // return b?gcd(b,a%b):a;
  8. //}
  9. //inline ll lcm(ll a,ll b){
  10. // return a*b/gcd(a,b);
  11. //}
  12. //void div(ll n){
  13. // for(int i=1;i*i<=n;i++){
  14. // if(n%i==0){
  15. // ll g=gcd(i,aa),l=lcm(i,ba);
  16. // if(g==ab && l==bb)ans++;
  17. // if(n/i!=i){
  18. // ll g=gcd(n/i,aa),l=lcm(n/i,ba);
  19. // if(g==ab && l==bb)ans++;
  20. // }
  21. // }
  22. // }
  23. //}
  24. //int main(){int T;
  25. // scanf("%d",&T);
  26. // while(T--){
  27. // ans=0;
  28. // scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
  29. // div(bb);
  30. // printf("%lld\n",ans);
  31. // }
  32. //}
  33. //Õý½â£º
  34. ll aa,ba,ab,bb,ans=;
  35. int prime[],ck[],tot;
  36. inline void div(int p){
  37. int ma0=,ma1=,mb0=,mb1=;
  38. while(aa%p==){ma0++;aa/=p;}
  39. while(ab%p==){ma1++;ab/=p;}
  40. while(ba%p==){mb0++;ba/=p;}
  41. while(bb%p==){mb1++;bb/=p;}
  42. if((ma0<ma1)||(mb0>mb1)) ans=;
  43. else if((ma0==ma1)&&(mb0<mb1) || (ma0>ma1)&&(mb0==mb1)){
  44. if(ma1>mb1)ans=;
  45. }
  46. else if((ma0==ma1)&&(mb0==mb1)){
  47. if(ma1<=mb1)ans*=(mb1-ma1+);
  48. else ans=;
  49. }
  50. else if((ma0>ma1)&&(mb0<mb1)){
  51. if(ma1!=mb1)ans=;
  52. }
  53. }
  54. int main(){
  55. for(int i=;i<=;i++){
  56. if(!ck[i])prime[++tot]=i;
  57. for(int j=;j<tot;j++){
  58. if(i*prime[j]>)break;
  59. ck[i*prime[j]]=;
  60. if(i%prime[j]==)break;
  61. }
  62. }
  63. int T;
  64. scanf("%d",&T);
  65. while(T--){
  66. ans=;
  67. scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
  68. for(int i=;i<=tot;i++){
  69. div(prime[i]);
  70. if(ans==)break;
  71. }
  72. if(bb>)div(bb);//²»È»»áwaÒ»¸öµã
  73. printf("%lld\n",ans);
  74. }
  75. }

[题解](gcd/lcm)luogu_P1072_Hankson的趣味题(NOIP2009)的更多相关文章

  1. CodeForces 992B Nastya Studies Informatics + Hankson的趣味题(gcd、lcm)

    http://codeforces.com/problemset/problem/992/B  题意: 给你区间[l,r]和x,y 问你区间中有多少个数对 (a,b) 使得 gcd(a,b)=x lc ...

  2. 「NOIP2009」Hankson 的趣味题

    Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...

  3. 洛谷P1072 [NOIP2009] Hankson 的趣味题

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

  4. [ 9.13 ]CF每日一题系列—— 340A GCD & LCM

    Description: [ 着实比较羞愧,都想着去暴力,把算法(方法)也忘了] A只涂x,2x,3x……,B只涂y,2y,3y……问你A和B共同涂的墙的个数 Solution: 就是求x和y的lcm ...

  5. NOIP 2009 Hankson 的趣味题

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

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

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

  7. luogu P1072 Hankson的趣味题

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

  8. 算法训练 Hankson的趣味题

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

  9. 1172 Hankson 的趣味题

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

随机推荐

  1. [usaco2003feb]impster

    FJ再也不用野蛮的方式为自己的奶牛编号了.他用一个B(1<=B<=16)位二进制编码给每头奶牛编号,并刻在奶牛耳朵上的金属条上.奶牛希望自己给自己选择一个编码.于是,瞒着FJ,他们制造了一 ...

  2. 关于MySQL的information_schema库简单介绍及实际应用

    本文简介 写本文主要是围绕下面几点进行的. 1.information_schema数据库到底是做什么用的? 2.执行alter table 表名 modify column 字段名 类型 这个sql ...

  3. shell动态变量

    面对变量中嵌套变量,可以这么做 other_devops_ip="......." options='_ip' tennat_name='other_devops' tennat_ ...

  4. Jmeter创建一个简单的http接口用例

    1.新建线程组 添加->Threads(Users)->线程组 线程组用来模拟用户进程. 2.添加http信息头管理器 添加->配置元件->http信息头管理器 Systemi ...

  5. [原创]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  6. 【应用】图片翻转js

    图片翻转:图片随着鼠标指针划过进行替换 <img src="example.gif" onmouseover="this.src='exampleTwo.gif'& ...

  7. 【C/C++】函数指针

    首先必须要清楚如下: [1]函数指针即函数的地址,也就是存储其机器语言代码的首地址.该地址用函数名表示. [2]用具体的函数名给函数指针变量赋值时必须满足两者的类型(即函数返回值类型)和特征标(即函数 ...

  8. 将linux系统用户导入mysql表

    下面这个程序实现的一个很简单的功能,读取passwd文件,将里面的用户信息写入到mysql里面, 具体代码如下: #!/usr/bin/python import pymysql import tim ...

  9. bzoj4247挂饰——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4247 就是01背包: 把挂钩数限制在n以内,因为不需要更多,而这会带来一些问题,就是有很多挂 ...

  10. Code-NFine:.NET快速开发平台 NFine.Framework Web框架

    ylbtech-Code-NFine:.NET快速开发平台 NFine.Framework Web框架 1.NFine.Framework 详细介绍返回顶部 1. NFine 是基于 C# 语言的极速 ...