- Violet Evergarden
题解
- @ 2025-12-21 23:39:23
这道题就是让你求解这么一个方程组:
$$\left\{\begin{matrix}a_1x+b_1y=c_1 \\a_2x+b_2y=c_2 \end{matrix}\right. $$然后无解或无数解输出No answer!。
这题其实是一个叫克莱姆法则的东西的究极弱化版。结论:
$$x=\frac{\begin{vmatrix}c_1 &b_1 \\c_2 &b_2 \end{vmatrix}}{\begin{vmatrix}a_1 &b_1 \\a_2 &b_2 \end{vmatrix}},y = \frac{\begin{vmatrix}a_1 &c_1 \\a_2 &c_2 \end{vmatrix}}{\begin{vmatrix}a_1 &b_1 \\a_2 &b_2 \end{vmatrix}} $$其中:
$$\begin{vmatrix}a &b \\c &d \end{vmatrix} = ad-bc $$无解或无数解就是当
$$\begin{vmatrix}a_1 &b_1 \\a_2 &b_2 \end{vmatrix} = 0$$的时候。
当然这也非常好推导,可以直接进行消元。我们让上面那个式子乘 ,下面那个式子乘 ,可以得到:
$$\left\{\begin{matrix}a_1a_2x+b_1a_2y=c_1a_2 \\a_2a_1x+b_2a_1y=c_2a_1 \end{matrix}\right. $$然后两个式子相减,就能将 消掉:
同理可得 :
就得到了上面那个式子。
至于无解或无数解,如果 ,那么两个式子左边的系数就可以化为相同的,此时如果右边的 是相同的就是无数解,不同就是无解。
最后记得化简。两个数同时除以它们的最大公因数,剩下的就没有公共的质因数了,然后就互质了。
code:
#include<bits/stdc++.h>
#define int long long
#define inf 1e18
#define lowbit(x) (x & -x)
#define fo(i,j,k,l) for(int i = j;i <= k;i += l)
using namespace std;
int a1,b1,c1,a2,b2,c2;
signed main()
{
freopen("violet.in","r",stdin);
freopen("violet.out","w",stdout);
cin >> a1 >> b1 >> c1 >> a2 >> b2 >> c2;
int d1 = c1 * b2 - c2 * b1,d2 = c2 * a1 - c1 * a2,d = a1 * b2 - a2 * b1;
if(d == 0)cout << "No answer!";
else cout << (d1 / __gcd(d1,d)) << '/' << (d / __gcd(d1,d)) << endl << (d2 / __gcd(d2,d)) << '/' << (d / __gcd(d2,d));
return 0;
}
对真正的克莱姆法则感兴趣的同学可以去搜索学习一下,可能有亿点点难,谨慎学习。
0 条评论
目前还没有评论...
信息
- ID
- 1253
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 162
- 已通过
- 13
- 上传者