luogu1072 [NOIp2009]Hankson的趣味题 (数学+STL::set)
一个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)的更多相关文章
- 洛谷P1072 [NOIP2009] Hankson 的趣味题
P1072 Hankson 的趣味题 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一 ...
- NOIP2009 Hankson 的趣味题 : 数论
题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解 ...
- NOIP2009 Hankson的趣味题
题目描述 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在 ...
- [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)
题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...
- [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 ...
- 洛谷P1072 Hankson 的趣味题(数学)
题意 题目链接 Sol 充满套路的数学题.. 如果你学过莫比乌斯反演的话不难得到两个等式 \[gcd(\frac{x}{a_1}, \frac{a_0}{a_1}) = 1\] \[gcd(\frac ...
- NOIP 2009 Hankson 的趣味题
洛谷 P1072 Hankson 的趣味题 洛谷传送门 JDOJ 1648: [NOIP2009]Hankson的趣味题 T2 JDOJ传送门 Description Hanks 博士是BT (Bio ...
- 「NOIP2009」Hankson 的趣味题
Hankson 的趣味题 [内存限制:$128 MiB$][时间限制:$1000 ms$] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 Hanks 博士是 BT(Bio-Tec ...
- CH3201 Hankson的趣味题
题意 3201 Hankson的趣味题 0x30「数学知识」例题 描述 Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson ...
随机推荐
- NIO之缓冲区
NIO引入了三个概念: Buffer 缓冲区 Channel 通道 selector 选择器 1.java.io优化建议 操作系统与Java基于流的I/O模型有些不匹配.操作系统要移动的是大块数据(缓 ...
- VS2015 搭建 Asp.net core 开发环境
1.首先你得装个vs2015 并且保证已经升级至 update3及以上(此处附上一个vs2015带up3的下载链接: ed2k://|file|cn_visual_studio_enterprise_ ...
- MVC使用Redis实现分布式锁
使用场景 在做Web项目的时候,有很多特殊的场景要使用到锁 比如说抢红包,资源分配,订单支付等场景 就拿抢红包来说,如果一个红包有5份,同时100个人抢如果没有用到锁的话 100个人同时并发都抢成功, ...
- aws ubuntu 开启root
Linux VPS没有ROOT权限是很难受的事,并且密码登陆也方便一些.我的AWS VPS的LINUX版本是UBUNTU 13.10,首先用AWS证书验证的账户登录, 1.修改ROOT密码sudo p ...
- 网页录像录音功能的实现之MediaRecorder的使用
前面介绍了通过H5实现在网页内打开摄像头和麦克风,实现截图和图像预览的相关知识. getUserMedia API及HTML5 调用摄像头和麦克风 一个简单的demo 实现摄像头的调用及视频录制,截 ...
- hdu 1263 水果 结构的排序+sort自定义排序
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- rabbitMq与spring boot搭配实现监听
在我前面有一篇博客说到了rabbitMq实现与zk类似的watch功能,但是那一篇博客没有代码实例,后面自己补了一个demo,便于理解.demo中主要利用spring boot的配置方式, 一.消费者 ...
- Linux内核分析作业八
进程的切换和系统的一般执行过程 贾瑗 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029 ...
- 在Windows Server 2008R2中部署 AspNetCore
1.部署时,先安装运行时 https://dotnet.microsoft.com/download 2.安装vc_redist.x64 https://www.microsoft.com/en- ...
- 9-Python3从入门到实战—基础之条件控制语句
Python从入门到实战系列--目录 条件判断 if 条件判断 if 语句语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> ...