首页 > 其他分享 >题解:P6299 差别

题解:P6299 差别

时间:2024-10-14 19:12:58浏览次数:6  
标签:varepsilon 差别 frac 题解 times beta P6299 alpha gamma

Problem Link

差别

题目描述

给定 \(a,b,c,d\),求 \(p,q,r,s\) 使得 \(M\) 成为非零最小值。

Solution

\(M\) 的表达式很复杂,把式子拆开有 \(16\) 个 \(4\) 次项,不难发现这是一个平方和,不断套平方和公式,最后化简成:

\[ M = |(ap+bq+cr-ds)^2 + (-aq+bp+cs+dr)^2| = ((a+bi) \times (p-qi) + (c+di) \times (r+si))^2。 \]

这样就可以用 exgcd 求解,但如何在复数值域上求解 exgcd 呢?

考虑使用带余除法进行计算,设 \(\alpha = a+bi, \beta = c+di\),则 \(\alpha = \varepsilon \beta + \gamma (\varepsilon, \gamma \in \mathbb{Z})\),用内除法和外除法定义复数的除法,但得保证 \(N(\gamma) \le \frac{N(\beta}{2}\)(\(N(\alpha)\) 表示 \(\alpha\) 的范数即 \(|\alpha|^2\))。

如何证明?

设 \(\gamma = p+qi = \frac{\alpha}{\beta}, \varepsilon = r+si(|r-p| \le \frac{1}{2}, |s-q| \le \frac{1}{2})\) 。

\(\therefore N (\gamma - \varepsilon) = (p-r)^ 2 + (q-s) ^ 2 \le \frac{1}{2}\) 。

\(\therefore \gamma = \alpha - \varepsilon \beta = (\gamma - \varepsilon) \times \beta\)。

\(\therefore N(\gamma) = N(\gamma - \varepsilon) \times N(\beta) \le \frac{1}{2} \times \beta\),证毕。

所以令 \(\varepsilon = \left \lfloor \frac{\alpha}{\beta} \right \rfloor, \gamma = \alpha \bmod \beta\) 即可。

实际上代码上实现只需要 $\alpha - \frac{\alpha}{\beta} \times \beta $ 即可表示 \(\alpha \bmod \beta\),最难的部分就是证明。

Code

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
inline ll lread(ll x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}

ll A, B, C, D, m;

struct plural
{
    ll x, y;
    plural () {}
    plural (ll x, ll y) : x(x), y(y) {}
    bool operator == (const plural &other) const {return (x == other.x) && (y == other.y);}
    plural operator+(const plural &other) const {return plural(x+other.x, y+other.y);}
    plural operator-(const plural &other) const {return plural(x-other.x, y-other.y);}
    plural operator*(const plural &other) const {return plural(x*other.x - y*other.y, x*other.y + y*other.x);}
    plural operator/(const plural &other) const {
        double a = x, b = y, c = other.x, d = other.y, alpha = (a*c + b*d) / (c*c + d*d), beta = (b*c - a*d) / (c*c + d*d);
        return plural(round(alpha), round(beta));
    }
    plural operator % (const plural &other) const {return (*this) - (*this) / other * other;}
};

void exgcd(plural a, plural b, plural &x, plural &y)
{
    // cerr << b.x << " " << b.y << endl;
    if(b == plural(0ll, 0ll)) return m = a.x * a.x + a.y * a.y, x = plural(1ll, 0ll), void();
    exgcd(b, a%b, x, y);
    plural tmp = x;
    x = y, y = tmp - a/b*y;
}

int main()
{
    A = lread(), B = lread(), C = lread(), D = lread();

    plural alpha = plural(A, B), beta = plural(C, D), x, y;
    exgcd(alpha, beta, x, y);

    printf("%lld %lld %lld %lld %lld", x.x, -x.y, y.x, y.y, m); 
}

Tips

记得开 long long

标签:varepsilon,差别,frac,题解,times,beta,P6299,alpha,gamma
From: https://www.cnblogs.com/naughty-naught/p/18464797

相关文章

  • 题解:P9743 「KDOI-06-J」旅行
    ProblemLink「KDOI-06-J」旅行题意题目讲的很清楚,不再过多赘述。Solution不难想到\(O(n^2\timesm^2\timesk)\)的做法:定义\(f_{i,j,val,x,y}\)为当前在\((x,y)\)的位置,花费\(val\)元,手上有\(x\)张\(L\)公司的票,\(y\)张\(Z\)公司的票的方案数,至于空间问题......
  • 题解:P1709 [USACO5.5] 隐藏口令 Hidden Password
    ProblemLink[USACO5.5]隐藏口令HiddenPassword题目描述求最小表示法的开头字母在原字符串的位置。Solution最小表示法板子,双指针解决即可。Code#include<iostream>#include<algorithm>#include<string.h>#include<cstring>#include<cmath>#include<cstdio>......
  • [PA2021] Od deski do deski 题解
    好题好题,难者不会会者不难,我是前者。实际上加入就可以合法的数是很好计算的。考虑现在所有前缀合法串后的字符实际上都可以满足条件。容易想到根据是否合法设置状态。设\(f_{i,j}/g_{i,j}\)表示现在填第\(i\)个数,有\(j\)个填了就合法的数,现在的串合法/不合法。那么有转......
  • 题解:P11145 Strange Homura Game
    ProblemLinkStrangeHomuraGame题意让你猜测一个数\(n\),你只能输出两次,每次输出一个数\(x\),返回\(x\bmodn\)。Solution令输入的数为\(A,B\),输出的数为\(a,b\),答案为\(n\)。一开始想的是CRT,但只能询问\(2\)次。发现输入的值是经过\(\bmodn\)的,已知\((A-a)......
  • 题解:AT_joi2021ho_b 雪玉 (Snowball)
    ProblemLink[JOI2021Final]雪玉题目描述翻译很简洁,不作赘述。Solution对于相邻的两个雪球\(a_i\)和\(a_{i+1}\),两者夹着的区间中的雪要么是被\(a_i\)或\(a_{i+1}\)卷起,要么不可能被清理掉。那么思路非常简单了,对于每个区间,只有\(2\)种情况:区间左侧雪球的最......
  • 题解:P2315 [HNOI2005] 数三角形
    ProblemLink[HNOI2005]数三角形题意输入一个大三角形的各个边存在情况,输出里面有多少个正三角形。Solution简单暴力即可,用\(4\)个数组维护每条边能延伸的最大长度,然后逐个判断三角形是否可行即可。如图,l_upper维护左端点向上(即$\ell_{BA}$),l_lower维护左端点向下(即......
  • 题解:AT_arc120_c [ARC120C] Swaps 2
    ProblemLink[ARC120C]Swaps2\(-1\)的情况判错卡了\(10\)几分钟,麻了。题面翻译给出\(2\)个序列\(a\)和\(b\),定义一次操作为:选定一个下标\(i\),先将\(a_i\)以及\(a_{i+1}\)交换,然后让\(a_i\)加一,最后让\(a_{i+1}\)减一。求最少操作次数使得\(a\)序列等......
  • 题解:[HNOI2009] 双递增序列
    ProblemLink[HNOI2009]双递增序列题目描述给定一个长度为\(n\)的序列(\(n\)为偶数),求是否可以把序列分成\(2\)个长度为\(\frac{n}{2}\)的递增序列。Solution首先想到定义\(f_i\)为一个序列以\(a_i\)结尾时另一个序列末尾最小值。但这样定义状态信息是不够的,考虑......
  • qoj6562 First Last 题解
    妙妙题。首先不同字母数最多为\(3\)。我们把每一个字母看成一个点。对于每一个字符串,首个字母朝末尾字母连一条有向边。那么问题变为了给定一张有向图,从某个点出发,每次走一条边,且边不能重复,不能走的人输。问哪方有必胜策略。先不考虑时间复杂度,那么这个可以直接爆搜。但是肯定......
  • 题解:P11063 【MX-X4-T3】「Jason-1」数对变换
    ProblemLink【MX-X4-T3】「Jason-1」数对变换题外话场上把贪心注重在一个奇怪地方了,导致交的时候已经有\(9\)个人\(\textcolor{green}{AC}\)了(哭)。题意简述对于数对\((x,y)\),你可以执行以下两种变换:类型1:取\(1\lek\lex\),令\((x,y)\gets(\lfloor\frac{x}{k}......