连续三次不开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的所有约数,在判断是否满足可过

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll aa,ba,ab,bb,ans;
inline ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
inline ll lcm(ll a,ll b){
return a*b/gcd(a,b);
}
void div(ll n){
for(int i=;i*i<=n;i++){
if(n%i==){
ll g=gcd(i,aa),l=lcm(i,ba);
if(g==ab && l==bb)ans++;
if(n/i!=i){
ll g=gcd(n/i,aa),l=lcm(n/i,ba);
if(g==ab && l==bb)ans++;
}
}
}
}
int main(){int T;
scanf("%d",&T);
while(T--){
ans=;
scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
div(bb);
printf("%lld\n",ans);
}
}

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))

#include<bits/stdc++.h>
#define ll long long
using namespace std;
//±©Á¦£º
//ll aa,ba,ab,bb,ans;
//inline ll gcd(ll a,ll b){
// return b?gcd(b,a%b):a;
//}
//inline ll lcm(ll a,ll b){
// return a*b/gcd(a,b);
//}
//void div(ll n){
// for(int i=1;i*i<=n;i++){
// if(n%i==0){
// ll g=gcd(i,aa),l=lcm(i,ba);
// if(g==ab && l==bb)ans++;
// if(n/i!=i){
// ll g=gcd(n/i,aa),l=lcm(n/i,ba);
// if(g==ab && l==bb)ans++;
// }
// }
// }
//}
//int main(){int T;
// scanf("%d",&T);
// while(T--){
// ans=0;
// scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
// div(bb);
// printf("%lld\n",ans);
// }
//}
//Õý½â£º
ll aa,ba,ab,bb,ans=;
int prime[],ck[],tot;
inline void div(int p){
int ma0=,ma1=,mb0=,mb1=;
while(aa%p==){ma0++;aa/=p;}
while(ab%p==){ma1++;ab/=p;}
while(ba%p==){mb0++;ba/=p;}
while(bb%p==){mb1++;bb/=p;}
if((ma0<ma1)||(mb0>mb1)) ans=;
else if((ma0==ma1)&&(mb0<mb1) || (ma0>ma1)&&(mb0==mb1)){
if(ma1>mb1)ans=;
}
else if((ma0==ma1)&&(mb0==mb1)){
if(ma1<=mb1)ans*=(mb1-ma1+);
else ans=;
}
else if((ma0>ma1)&&(mb0<mb1)){
if(ma1!=mb1)ans=;
}
}
int main(){
for(int i=;i<=;i++){
if(!ck[i])prime[++tot]=i;
for(int j=;j<tot;j++){
if(i*prime[j]>)break;
ck[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
int T;
scanf("%d",&T);
while(T--){
ans=;
scanf("%d%d%d%d",&aa,&ab,&ba,&bb);
for(int i=;i<=tot;i++){
div(prime[i]);
if(ans==)break;
}
if(bb>)div(bb);//²»È»»áwaÒ»¸öµã
printf("%lld\n",ans);
}
}

[题解](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. Boost智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...

  2. Window 64位下的客户机配置PLSQL链接远程Oracle

    此文章记录的是艰难探索. 完成如下工作: 服务器A为Windows Serve 2016:安装Oracle. 客户机B为Win7 x64位,安装PLSQLDevelop,链接A上的Oracle. 首先 ...

  3. 自定义标签(客户化jsp标签)

    客户化jsp标签技术是在jsp1.1版本中才出现的,他支持用户在jsp文件中自定义标签,这样可以使jsp代码更加简单,这些可重用的标签能够处理复杂的逻辑运算和事物或定义jsp网页的输出内容和格式. 创 ...

  4. 关于使用response.addHeader下载中文名乱码问题

    介绍下我项目中遇到的问题:在数据库导出Excel文件的过程中,导出文件中文名始终异常,最终结果发现需要在response.addHeader 中的 filename = "xxxx" ...

  5. 烂笔头——JAVA/JSP

    学艺不精,一些小零头放这里备忘 Object[] obj = (Object[])list.get(i);//取list的某个项目 jsp中出现out.println( )和System.out.pr ...

  6. Swift 控制语句

    Control Flow指的是『逻辑控制语句』,包括if.if-else.for.for-in.while.do-while.switch等.其中大部分和OC中差不多,但Swift在某些方便增强了控制 ...

  7. AutoIt: 如何使用 AutoIt 解析,修改XML 文件

    项目组这次要发布一个项目,需要实施人员根据现场的机器情况,修改项目配置文件的几个节点,为了减轻实施人员的工作负担,我应用AutoIt写了一个小界面,实施人员只需在该界面上点几个按钮,就能够完成文件的配 ...

  8. atexit函数详解

    对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...

  9. 文件的打开函数第一类--fopen()

        fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, “文件指针名”必须是被说明为FILE 类型的指针变量: “文件名”是被打开文件的 ...

  10. Android Studio工程Gradle编译报错

    一.环境的搭建: 首先搭建好AndroidStudio环境.我使用的是Ubuntu 12.04系统(由于此机器还要运行其他程序,为避免兼容性问题,暂未更新到最新,而继续沿用此稳定版),java和jdk ...