一个JSB做法

由$\frac{x*b0}{gcd(x,b0)}=b1$,可得$\frac{x}{gcd(x,b0)}=\frac{b1}{b0}$

设$b2=\frac{b1}{b0}$

所以对$b2$和$b0$分解质因数,可以得到结论:

  1.x必须包含b2中所有的质因数,且个数等于它在b2和b0(如果b0中有的话)中的数量和

  2.对于b0中有但b2中没有的质因数,x中它的个数可以是[0,b0中的个数]

然后关于a0和a1,也有结论:

  1.x中必须包含a1中的所有质因数

  2.x中不能包含a0中的、a1以外的(在数量和种类方面)质因数

然后就可以开始乱搞了

首先打出1e5以内的素数,然后拿着它们分解质因数(因为我只需要做到$\sqrt{N}$)。注意一个数如果最后剩下不是1,那么剩下这个数也是个质因数(大于$\sqrt{N}$)

然后把这些存到set里,按照上面的规则乱搞......

一个数最多大概也就十几种质因数,所以复杂度没什么问题。

 #include<bits/stdc++.h>
#define pa pair<int,int>
#define IT set<pa>::iterator
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+,inf=2e9+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} bool ispri[maxn];
int pri[maxn],pct;
set<pa> g[]; inline void get(int id,int x){
g[id].clear();
for(int i=;x>&&i<=pct;i++){
if(x<pri[i]) break;
if(x%pri[i]) continue;
int cnt=;
while(x%pri[i]==) x/=pri[i],cnt++;
g[id].insert(make_pair(pri[i],cnt));
}
if(x!=) g[id].insert(make_pair(x,)); } int main(){
int i,j;
int N=rd();
CLR(ispri,);ispri[]=ispri[]=;
for(i=;i<=;i++){
if(ispri[i]){
for(j=i+i;j<=;j+=i){
ispri[j]=;
}
}
}for(i=,j=;i<=;i++) if(ispri[i]) pri[++pct]=i;
for(i=;i<=N;i++){
int a1=rd(),a2=rd(),b1=rd(),b2=rd();
int b3=b2/b1;
get(,a1);get(,a2);get(,b1);get(,b3);
g[].clear();
for(IT it=g[].begin();it!=g[].end();it++){
IT it2=g[].lower_bound(make_pair(it->first,-));
if(it2->first!=it->first) g[].insert(make_pair(it->first,));
else if(it2->second!=it->second) g[].insert(make_pair(it->first,it2->second));
else g[].insert(make_pair(it->first,-it2->second));
}
int ans=;
for(IT it=g[].begin();it!=g[].end();it++){
IT it2=g[].lower_bound(make_pair(it->first,-inf));
IT it3=g[].lower_bound(make_pair(it->first,-inf));
if(it->second&&it2->first!=it->first&&it3->first!=it->first) ans=;
if(it->first==it3->first&&it2->first!=it->first&&((it->second>=&&it3->second!=it->second)||(it->second<&&(-it->second)>it3->second))) ans=;
}
if(!ans) {printf("0\n");continue;}
for(IT it=g[].begin();it!=g[].end()&&ans;it++){
IT it2=g[].lower_bound(make_pair(it->first,-inf));
IT it3=g[].lower_bound(make_pair(it->first,-inf));
if(it2->first!=it->first){
if(it3->first!=it->first) ans*=it->second+;
else if(abs(it3->second)>it->second) ans=;
else if(it3->second<) ans*=it->second+it3->second+;
}else{
if(it3->first!=it->first);
else if(it3->second>=&&it3->second!=it2->second+it->second) ans=;
else if(it3->second<&&it2->second+it->second<-it3->second) ans=;
}
}
printf("%d\n",ans);
}
return ;
}

luogu1072 [NOIp2009]Hankson的趣味题 (数学+STL::set)的更多相关文章

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

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

  2. NOIP2009 Hankson 的趣味题 : 数论

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

  3. NOIP2009 Hankson的趣味题

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

  4. [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)

    题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...

  5. [NOIp2009] $Hankson$ 的趣味题

    类型:数论 传送门:>Here< 题意:给出四个数$a_0,a_1,b_0,b_1$,求满足$gcd(x,a_0)=a_1,lcm(x,b_0)=b_1$的$x$的个数 解题思路 显然$a ...

  6. 洛谷P1072 Hankson 的趣味题(数学)

    题意 题目链接 Sol 充满套路的数学题.. 如果你学过莫比乌斯反演的话不难得到两个等式 \[gcd(\frac{x}{a_1}, \frac{a_0}{a_1}) = 1\] \[gcd(\frac ...

  7. NOIP 2009 Hankson 的趣味题

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

  8. 「NOIP2009」Hankson 的趣味题

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

  9. CH3201 Hankson的趣味题

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

随机推荐

  1. CSS 边框(border)实例

    CSS 边框(border)实例:元素的边框 (border) 是围绕元素内容和内边距的一条或多条线. CSS border 属性允许你规定元素边框的样式.宽度和颜色. CSS 边框属性属性 描述bo ...

  2. Centos下添加静态路由(临时和永久有效)的操作记录

    公司IDC机房服务器上部署了一套外网LB环境,默认配置的是外网ip的路由地址,由于要和其他内网机器通信,所以需要配置内网ip的路由地址.整个操作过程,记录如下,以供以后参考学习: 1)内网网卡绑定 [ ...

  3. shell+curl监控网站页面(域名访问状态),并利用sendemail发送邮件

    应领导要求,对公司几个主要站点的域名访问情况进行监控.下面分享一个监控脚本,并利用sendemail进行邮件发送. 监控脚本如下:下面是写了一个多线程的网站状态检测脚本,直接从文件中读出站点地址,然后 ...

  4. BugPhobia开发篇章:Beta阶段第VIII次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第八次Scrum Meeting 敏捷开发起始时间 2015/12/22 00:00 A.M. 敏捷开发终止时间 2015/12/22 23 ...

  5. Java实验报告一:Java开发环境的熟悉

    实验要求: 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 实验内容 (一)   命令行下Java程序开发 (二)Eclipse下Java程序 ...

  6. Linux内核设计与实现 第四章

    1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...

  7. oracle alter

    ALTER TABLE (表名) ADD CONSTRAINT (索引名);ALTER TABLE (表名) DROP CONSTRAINT (索引名); ALTER TABLE (表名) ADD ( ...

  8. HDU 2011 多项式求和

    http://acm.hdu.edu.cn/showproblem.php?pid=2011 Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/ ...

  9. 自己站点的nginx 配置信息

    user www www; worker_processes auto; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/ng ...

  10. Win10 打开 ubuntu子系统

    1. 修改windows的设置, 增加开发人员模式 针对开人员模式 使用添加删除程序 添加 ubuntu子系统的角色 运行输入control.. 然后添加删除程序 安装完后重启 运行输入 bash 就 ...