\(23333\)这是最近第二份在时间上吊打\(yjk\)的代码……啊哈哈哈哈哈哈哈

嗯,其实遇到这种单纯的\(gcd \ \ or \ \ lcm\)的题,我们都可以用一种比较简单的方法分析:唯一分解定理。

嗯,是整数域的唯一分解,不是多项式域的唯一分解(\(2333\)中了群环域的毒)

那么其实很显然,关于这种解法,大部分来讲都是先筛出数据范围上限\(\sqrt n\)即可。但是有个\(Bug\)就是对于每个合数\(k\),都最多有一个质因子是大于\(\sqrt k\)的由于数据范围过大窝萌没法直接筛,而我正是解决了这个问题(虽然有点慢\(233\)).

我们思考对于\(a_0\)和\(a_1\)而言,假设\(gcd(x,a_0)=a_1\)

那么我们会有比较浅显的结论:若$$a_0=\prod\limits_{i=1}{m}p_i{c_i},x=\prod\limits_{i=1}{n}p_i{d_i}$$那么$$a_1=\prod\limits_{i=1}{max(m,n)}p_i{min(c_i,d_i)}$$那我们反着考虑,对于他们的\(gcd\)——\(a_1\)里的\(p_i\)来讲,要么是\(a_0\)中的,要么是\(x\)中的。换句话说,如果\(c_i = min(c_i,d_i)\),那么\(d_i\)只需要\(\geq~c_i\)即可,也就是说\(d_i\)可以在区间\([c_i,\infty)\)上随便取,我们现在称这个\(x\)为自由未知数(\(free\ \ uknown -number\)),称这个区间为自由区间(\(free\ \ ranges\))

而如果不一样,就只可能是\(c_i>min(d_i,c_i)\),此时没有任何取法,只有可能是\(d_i=min(d_i,c_i)\),所以就只能有一种选法,我们现在称这个\(x\)为非自由未知数(\(unfree\ \ uknown-number\))

同理,\(lcm\)那部分也一样。\(emmm\)只不过由左闭右开变成右闭左开区间而已\(2333\)

但是这个地方需要注意的是,我们需要考虑\(2^2\)种不同情况:

\(1\)、两个方程的\(x\)均非自由,那么如果不同的话就会无解。

\(2 \&3\)、\(gcd\)或者\(lcm\)中有一个非自由,我们需要判断这个非自由的解是否是在另一个的自由区间内,不在就是不合法。

\(4\)、都是自由的,那么就做个差留到最后乘法原理。

代码大概长这样:

inline void Linearity(){
T = qr() ;
Chk[1] = Chk[0] = 1 ;
for (i = 2 ; i <= MAX ; ++ i){
if (!Chk[i]) P[++ P[0]] = i ;
for (j = 1; j <= P[0] && i * P[j] <= MAX ; ++ j){
Chk[i * P[j]] = 1 ;
if (i % P[j] == 0) break ;
}
}
}
inline void work(int ST, int ED){
for(i = ST; i <= ED ; ++ i){
N1 = N2 = N3 = N4 = 0 ;
while (!(A0 % P[i])) A0 /= P[i], ++ N1 ;
while (!(A1 % P[i])) A1 /= P[i], ++ N2 ;
while (!(B0 % P[i])) B0 /= P[i], ++ N3 ;
while (!(B1 % P[i])) B1 /= P[i], ++ N4 ;
if (N1 > N2 && N3 < N4){
if (N2 == N4) A[i] = B[i] = 1 ;
else {mark = 0; break ;}
continue ;
}
if (N1 > N2){
if (N4 >= N2) A[i] = B[i] = N2 ;
else {mark = 0; break ;}
continue ;
}
if (N3 < N4){
if (N4 >= N2) A[i] = B[i] = N3 ;
else {mark = 0; break ;}
continue ;
}
else {
if (N4 >= N2) A[i] = N2, B[i] = N4 ;
else {mark = 0; break ;}
}
}
}

那么接下来的问题就是该怎么确定最后一个质因子。有一个很显然的做法是由于是最后一个质因子,所以我们只需要判断一下分解完质因数每一个是不是\(1\)即可,不是\(1\)的话,那就肯定是未筛到的,我们直接让他加入\(prime\)数组即可。哦,对,还需要再筛一遍,详情看代码即可。

#include <cstdio>
#include <bitset>
#include <iostream>
#define MAX 45000
#define ll long long using namespace std ;
bitset <MAX> Chk ; int A0, A1, B0, B1 ;
int Ans, T, i, j, P[MAX >> 2] ; bool mark ;
int N1, N2, N3, N4, A[MAX >> 2], B[MAX >> 2], Txt ; inline int qr(){
int k = 0 ; char c = getchar() ;
while(!isdigit(c)) c = getchar() ;
while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48, c = getchar() ;
return k ;
}
inline void Linearity(){
T = qr() ;
Chk[1] = Chk[0] = 1 ;
for (i = 2 ; i <= MAX ; ++ i){
if (!Chk[i]) P[++ P[0]] = i ;
for (j = 1; j <= P[0] && i * P[j] <= MAX ; ++ j){
Chk[i * P[j]] = 1 ;
if (i % P[j] == 0) break ;
}
}
}
inline void work(int ST, int ED){
for(i = ST; i <= ED ; ++ i){
N1 = N2 = N3 = N4 = 0 ;
while (!(A0 % P[i])) A0 /= P[i], ++ N1 ;
while (!(A1 % P[i])) A1 /= P[i], ++ N2 ;
while (!(B0 % P[i])) B0 /= P[i], ++ N3 ;
while (!(B1 % P[i])) B1 /= P[i], ++ N4 ;
if (N1 > N2 && N3 < N4){
if (N2 == N4) A[i] = B[i] = 1 ;
else {mark = 0; break ;}
continue ;
}
if (N1 > N2){
if (N4 >= N2) A[i] = B[i] = N2 ;
else {mark = 0; break ;}
continue ;
}
if (N3 < N4){
if (N4 >= N2) A[i] = B[i] = N3 ;
else {mark = 0; break ;}
continue ;
}
else {
if (N4 >= N2) A[i] = N2, B[i] = N4 ;
else {mark = 0; break ;}
}
}
}
int main(){
freopen("son.in", "r", stdin) ;
freopen("son.out", "w", stdout) ;
Linearity() ;
while(T --){
Ans = 1, mark = 1 ;
A0 = qr(), A1 = qr(), B0 = qr(), B1 = qr() ;
work(1, P[0]) ;
if (A0 != 1 || A1 != 1 || B0 != 1 || B1 != 1){
Txt = P[0] + 1 ;
if (B1 != 1) P[++ P[0]] = B1 ;
if (A1 != 1 && A1 != B1) P[++ P[0]] = A1 ;
if (A0 != 1 && A0 != B1 && A0 != A1) P[++ P[0]] = A0 ;
if (B0 != 1 && B0 != B1 && B0 != A1 && B0 != A0) P[++ P[0]] = B0 ;
work(Txt, P[0]) ;
}
for(i = 1; i <= P[0] && mark ; ++ i) Ans *= (B[i] - A[i] + 1) ;
if (!mark) putchar('0'), putchar('\n') ;
else printf("%d\n", Ans) ;
}
}

最后还有彩蛋哦:

\(1\)、这个题中的关键代码,就是work函数是在我事先考虑清楚,事中如同做梦,事后不可思议的情况下写出来的……也就是说当时写代码的时候码力突然增强了一个量级\(2333\)

\(2\)、关于什么自由不自由的定义……哈哈哈哈那只是我的突发奇想而已不是故意哲学!不是!但是你会发现以下的文字阐述确实会简练好多啊

\(3\)、其实你如果去不找另一个比较大的质数,也是可以得\(90\)分的!从\(loj\)的数据来看,前面的测试点一路顺风,只有最后一个测试点是专门卡这一点的,因为出现了好多行答案不相同的情况\(2333\)

\(4\)、其实我觉得我最后的操作是跟\(AlphaGo\)动态学习处理信息有点异曲同工之处的,哈哈哈得瑟了好久顿时觉得自己很\(google\)(奇怪的形容词?)。

\(5\)、很迷??为什么我就始终卡不进\(200ms\)?woc复杂度明明还可以啊\(2333\)

[NOIp2009] $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. 慕课网 jQuery 笔记

    $("div").html()是使用标签选择器获取div标签,对应于javascript中的各类选择器 $("*") ——所有元素 $("#lastn ...

  2. Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825

    Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825 1. 播放系统服务器方面的维护2 1.1. 默认情况下,已经在系统的启动目录下增加了俩个启动项目2 1.2. ...

  3. Flutter自定义标题栏之处理状态栏高度

    App在很多情况下由于各种需求需要自定义标题栏,而在能够构建Android和IOS应用的Flutter中,如果不在Scaffold中使用AppBar会发现默认是沉浸式. 猜想:我们使用自定义标题栏好像 ...

  4. linux centos7最小化安装NAT模式网络设置

    1.网络连接设置为NAT模式2.开启CentOS7,以root登陆3.vi /etc/sysconfig/network-scripts/ifcfg-ensXXXX4.设置BOOTPROTO=dhcp ...

  5. Others

    1.可迭代对象可以被for循环获取 2.可变与不可变对象 不可变对象:数字 字符串 元组 所谓不可变是值和身份都不变          赋值时开辟新内存空间生成新值 可变    对象:列表 字典 集合 ...

  6. 数据契约(DataContract)里的DataMember特性

      数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可 ...

  7. 关于 ExpressRoute 的虚拟网络网关

    虚拟网络网关用于在 Azure 虚拟网络和本地位置之间发送网络流量. 配置 ExpressRoute 连接时,必须创建并配置虚拟网络网关和虚拟网络网关连接. 创建虚拟网络网关时,需要指定几项设置. 其 ...

  8. mysql数据库的常用命令总结及具体操作步骤

    从头复习一下数据库的语法 use database;  --- 使用数据库 show databases/tables --- 查看所有的数据库/表 desc table; --- 查看表的结构 cr ...

  9. jsp 页面间传递参数

    JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...

  10. [控件] TranformFadeView

    TranformFadeView 效果图: 源码地址: https://github.com/YouXianMing/UI-Component-Collection 注意: maskView是iOS8 ...