题目链接:洛谷

题目描述:求整数$x\in [a,b]$使得$|2px \ mod \ 2q-q|$最小,如果有多个$x$输出最小的。

数据范围:$1\leq a,b,p,q\leq 10^9$


第一道类欧的不是模板的题??

首先一看就尝试一下二分,如何判断$2px \ mod \ 2q \in [l,r]$呢?我们发现

$$[2px \ mod \ 2q \in [l,r]]=\lfloor\frac{2px-l}{2q}\rfloor-\lfloor\frac{2px-r-1}{2q}\rfloor$$

所以存在$x\in [a,b]$使得$2px \ mod \ 2q \in [l,r]$,只需要判断$\sum_{x=a}^b(\lfloor\frac{2px-l}{2q}\rfloor-\lfloor\frac{2px-r-1}{2q}\rfloor)$是否大于0就可以了,这个使用类欧计算。

找到最小的偏差值$l$之后可以使用扩欧解同余方程。时间复杂度$O(\log^2 n)$。

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
LL t, a, b, p, q, len;
inline LL calc(LL a, LL b, LL c, LL n){
if(!a || !n) return (n + ) * (b / c);
if(n < ) return ;
LL m = (a * n + b) / c;
if(a >= c || b >= c) return calc(a % c, b % c, c, n) + (n * (n + ) >> ) * (a / c) + (n + ) * (b / c);
return m * n - calc(c, c - b - , a, m - );
}
inline LL exgcd(LL a, LL b, LL &x, LL &y){
if(!b){x = ; y = ; return a;}
LL gcd = exgcd(b, a % b, y, x);
y -= a / b * x;
return gcd;
}
int main(){
scanf("%lld", &t);
while(t --){
scanf("%lld%lld%lld%lld", &a, &b, &p, &q);
LL l = , r = q, mid, P = p << , Q = q << ;
while(l < r){
mid = l + r >> ;
LL L = q - mid, R = q + mid + ;
if(calc(P, Q - L, Q, b) + calc(P, Q - R, Q, a - ) - calc(P, Q - L, Q, a - ) - calc(P, Q - R, Q, b) > ) r = mid;
else l = mid + ;
}
LL x, y, gcd = exgcd(P, Q, x, y), ans = 1e9; P /= gcd; Q /= gcd;
if((q - l) % gcd == ){
LL xx = (q - l) / gcd * x; xx += (a - xx) / Q * Q;
while(xx >= a) xx -= Q; while(xx < a) xx += Q;
ans = min(ans, xx);
}
if((q + l) % gcd == ){
LL xx = (q + l) / gcd * x; xx += (a - xx) / Q * Q;
while(xx >= a) xx -= Q; while(xx < a) xx += Q;
ans = min(ans, xx);
}
printf("%lld\n", ans);
}
}

CF1182F

后来看了一波官方题解,结果发现是一个类似BSGS的分块,时间复杂度$O(\sqrt{n})$。(写得不好还要带一个log...)

(还是上面那个方法更好一些)

(最主要是看起来更高大上一点。。。)

CF1182F Maximum Sine【类欧,扩欧】的更多相关文章

  1. [CF1182F]Maximum Sine

    题意:\(f(x) = \text{abs}(\text{sin}(\frac{p}{q} \pi x))\),给定\(a,b,p,q\),求\(x\in[a,b]\)最大的\(f(x)\). 题解: ...

  2. 【POJ】2115 C Looooops(扩欧)

    Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...

  3. 洛谷P4774 [NOI2018]屠龙勇士 [扩欧,中国剩余定理]

    传送门 思路 首先可以发现打每条龙的攻击值显然是可以提前算出来的,拿multiset模拟一下即可. 一般情况 可以搞出这么一些式子: \[ atk_i\times x=a_i(\text{mod}\ ...

  4. 【洛谷】【扩欧】P1516 青蛙的约会

    [题目描述] 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有 ...

  5. 欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍

    1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. int gcd(int x,int y){ ?x:gcd(y,x%y); } int lcm(int x,int y){ return x* ...

  6. 洛谷 P5269 欧稳欧再次学车 题解

    P5269 欧稳欧再次学车 题目背景 请自行脑补一张欧稳欧学车的图 题目描述 欧稳欧学车时经常用一辆橡树车练习.这辆橡树车共有 \(N\) 个挡位,欧稳欧每秒可以把挡位增加或减少 \(1\),初始时( ...

  7. 【POJ】 1061 青蛙的约会(扩欧)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 119148   Accepted: 25070 Descript ...

  8. 【NOI 2018】屠龙勇士(扩欧)

    题意理解错了... 一把剑打一条龙,打了$x$次后如果龙不死,你就Game Over了. 显然,面对每条龙使用的剑是固定的,如果所有龙中有一条没打死你就挂了. 可以知道,可行的答案集合就是所有龙的可行 ...

  9. 【POJ】1061 青蛙的约会 / 【BZOJ】1477(扩欧)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 119148   Accepted: 25070 Descript ...

随机推荐

  1. s5p6818 从SD卡启动程序(制作SD启动卡)

    背景: 最近在学习uboot,其中有一步很重要的任务就是需要实现uboot 的验证,没有办法验证uboot是不是自己做的,那么整个开发就会收到阻碍.另外,从公司现在开发的板子来看,uboot从sd卡启 ...

  2. vsftp多个用户公享同一个文件,但是权限不同

    如标题:vsftp多个用户公享同一个文件,但是权限不同.如何做到呢.首先创建多个用户,并且指定同一个目录

  3. deferred.promise.then().then()异步链式操作(Chain operation)

    //deferred.promise.then().then() deferred.promise.then(function () { console.log('1 resolve'); retur ...

  4. (七)Redis之持久化之RDB方式

    一.持久化概念 所有的数据都存在内存中,从内存当中同步到硬盘上,这个过程叫做持久化过程. 使用方法: 1. rdb持久化方法:在指定的时间间隔写入硬盘 2.         aof方式:将以日志,记录 ...

  5. eventFlow 系列 <三> 查询所有

    接着上面的例子,产生2条数据.怎么把这两条数据查询出来呢? var commandBus = resolver.Resolve<ICommandBus>(); , ); var execu ...

  6. Spring AOP编程经验总结

    编程范式概览:面向过程,面向对象,函数式编程,事件驱动编程,面向切面等, AOP是什么? Spring AOP是采用面向切面编程的编程范式,而非编程语言,它只能解决特定问题,而非所有问题,它与OOP不 ...

  7. C# 哥德巴赫猜想的实现方式 region分区编写

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  8. 用js原生加jquery实现下拉跳转至商品详情页,上拉回到商品简介

    在做一个商城的项目时,做到商品详情页的时候需要实现这种下拉跳转到商品详情页加载许多图片,上拉回到商品简介的效果,并且需要用户在滑动时有一种费力的感觉.最初是通过iscroll插件实现的,但这个插件在使 ...

  9. PHP常见算法

    算法的概念:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作.一个问题可以有多种算法,每种算法都不同的效率.一个算法具有的特征:有穷,确切,输入,输出,可行 ...

  10. NORDIC 关闭浮点运算FPU

    1.打开FPU中断 NVIC_SetPriority(FPU_IRQn, APP_IRQ_PRIORITY_LOW);NVIC_EnableIRQ(FPU_IRQn); 2.中断中关闭FPU void ...