[XSY] 简单的数论题(数学、构造)

简单的数论题

m ( a 3 + b 3 ) = n ( c 3 + d 3 ) m(a^3+b^3)=n(c^3+d^3) m(a3+b3)=n(c3+d3)
考 虑 因 式 分 解 ( a 3 + b 3 ) , ( c 3 + d 3 ) : 考虑因式分解(a^3+b^3),(c^3+d^3): (a3+b3),(c3+d3):
a 3 + b 3 = ( a + b ) 3 − 3 a b ( a + b ) = ( a + b ) ( a 2 + b 2 − a b ) a^3+b^3=(a+b)^3-3ab(a+b)=(a+b)(a^2+b^2-ab) a3+b3=(a+b)33ab(a+b)=(a+b)(a2+b2ab)
c 3 + d 3 = ( c + d ) 3 − 3 c d ( c + d ) = ( c + d ) ( c 2 + d 2 − c d ) c^3+d^3=(c+d)^3-3cd(c+d)=(c+d)(c^2+d^2-cd) c3+d3=(c+d)33cd(c+d)=(c+d)(c2+d2cd)
∴ m ( a + b ) ( a 2 + b 2 − a b ) = n ( c + d ) ( c 2 + d 2 − c d ) \therefore m(a+b)(a^2+b^2-ab)=n(c+d)(c^2+d^2-cd) m(a+b)(a2+b2ab)=n(c+d)(c2+d2cd)
等 式 两 边 带 着 系 数 m , n 很 不 方 便 , ( a 2 + b 2 − a b ) , ( c 2 + d 2 − c d ) 结 构 较 复 杂 , 等式两边带着系数m,n很不方便,(a^2+b^2-ab),(c^2+d^2-cd)结构较复杂, m,n便(a2+b2ab),(c2+d2cd)
考 虑 用 ( a + b ) , ( c + d ) 把 m , n 消 掉 : 考虑用(a+b),(c+d)把m,n消掉: (a+b),(c+d)m,n
令 a + b = k n , c + d = k m 令a+b=kn,c+d=km a+b=kn,c+d=km
∴ a 2 + b 2 − a b = c 2 + d 2 − c d ① \therefore a^2+b^2-ab=c^2+d^2-cd① a2+b2ab=c2+d2cd
尽 量 让 左 式 出 现 ( a + b ) , 右 式 出 现 ( c + d ) : 尽量让左式出现(a+b),右式出现(c+d): (a+b)(c+d):
( a + b ) 2 − 3 a b = ( c + d ) 2 − 3 c d (a+b)^2-3ab=(c+d)^2-3cd (a+b)23ab=(c+d)23cd
k 2 n 2 − 3 a b = k 2 m 2 − 3 c d k^2n^2-3ab=k^2m^2-3cd k2n23ab=k2m23cd
k 2 ( n 2 − m 2 ) = 3 ( a b − c d ) k^2(n^2-m^2)=3(ab-cd) k2(n2m2)=3(abcd)
考 虑 令 k = 3 , 构 造 3 ( n 2 − m 2 ) = a b − c d ② : 考虑令k=3,构造3(n^2-m^2)=ab-cd②: k=3,3(n2m2)=abcd:
尝 试 1 : 令 a b = 3 n 2 , c d = 3 m 2 , 与 a + b = 3 n , c + d = 3 m 联 立 求 解 a , b , c , d 尝试1:令ab=3n^2,cd=3m^2,与a+b=3n,c+d=3m联立求解a,b,c,d 1ab=3n2,cd=3m2a+b=3n,c+d=3ma,b,c,d
结 果 : 方 程 无 解 结果:方程无解
尝 试 2 : 因 为 已 知 ( a + b ) , ( c + d ) , 考 虑 求 出 ( a − b ) , ( c − d ) : 尝试2:因为已知(a+b),(c+d),考虑求出(a-b),(c-d): 2(a+b),(c+d),(ab),(cd):
回 到 ① 式 , 让 左 式 出 现 ( a − b ) , 右 式 出 现 ( c − d ) : 回到①式,让左式出现(a-b),右式出现(c-d): (ab)(cd)
( a − b ) 2 + a b = ( c − d ) 2 + c d (a-b)^2+ab=(c-d)^2+cd (ab)2+ab=(cd)2+cd
让 此 式 向 ② 式 靠 近 : 让此式向②式靠近:
( c − d ) 2 − ( a − b ) 2 = a b − c d ③ (c-d)^2-(a-b)^2=ab-cd③ (cd)2(ab)2=abcd
② ③ 联 立 得 : ②③联立得:
( c − d ) 2 − ( a − b ) 2 = 3 ( n 2 − m 2 ) (c-d)^2-(a-b)^2=3(n^2-m^2) (cd)2(ab)2=3(n2m2)
令 u = c − d , v = a − b 令u=c-d,v=a-b u=cd,v=ab
u 2 − v 2 = 3 ( n 2 − m 2 ) u^2-v^2=3(n^2-m^2) u2v2=3(n2m2)
( u + v ) ( u − v ) = 3 ( n + m ) ( n − m ) (u+v)(u-v)=3(n+m)(n-m) (u+v)(uv)=3(n+m)(nm)
把 3 放 进 其 中 一 个 括 号 中 : 把3放进其中一个括号中: 3
( u + v ) ( u − v ) = ( n + m ) ( 3 n − 3 m ) (u+v)(u-v)=(n+m)(3n-3m) (u+v)(uv)=(n+m)(3n3m)
令 u + v = n + m , u − v = 3 n − 3 m 令u+v=n+m,u-v=3n-3m u+v=n+m,uv=3n3m
解 得 u = 2 n − m , v = 2 m − n 解得u=2n-m,v=2m-n u=2nm,v=2mn
由 a + b = 3 n , a − b = 2 m − n 得 a = n + m , b = 2 n − m 由a+b=3n,a-b=2m-n得a=n+m,b=2n-m a+b=3n,ab=2mna=n+m,b=2nm
由 c + d = 3 m , c − d = 2 n − m 得 c = n + m , d = 2 m − n 由c+d=3m,c-d=2n-m得c=n+m,d=2m-n c+d=3m,cd=2nmc=n+m,d=2mn

如此,我们便构造出了一组整数解


考虑何时有正整数解:
2 n − m > 0 , 2 m − n > 0 2n-m>0,2m-n>0 2nm>0,2mn>0
∴ n m ∈ ( 1 2 , 2 ) 时 所 得 为 正 整 数 解 \therefore \frac{n}{m}\in(\frac{1}{2},2)时所得为正整数解 mn(21,2)

n m ∉ ( 1 2 , 2 ) \frac{n}{m}\not\in (\frac{1}{2},2) mn(21,2),寻找 p 3 n q 3 m ∈ ( 1 2 , 2 ) \frac{p^3n}{q^3m}\in(\frac{1}{2},2) q3mp3n(21,2)(令 a , b a,b a,b变为原来的 q q q倍, c , d c,d c,d变为原来的 p p p倍)

为了方便,我们设 n < m n<m n<m(否则的话swap(n,m)即可)
那么此时必然有 0 < n m < 1 0<\frac{n}{m}<1 0<mn<1
若 n m < 1 4 , n m ← 2 3 n m 若\frac{n}{m}<\frac{1}{4},\frac{n}{m}\leftarrow\frac{2^3n}{m} mn<41,mnm23n (保证变化后 n m < 2 \frac{n}{m}<2 mn<2)
若 1 4 < = n m < = 1 2 , n m ← 2 3 n 3 3 m 若\frac{1}{4}<=\frac{n}{m}<=\frac{1}{2},\frac{n}{m}\leftarrow\frac{2^3n}{3^3m} 41<=mn<=21,mn33m23n (保证变化后 1 2 < n m < 2 \frac{1}{2}<\frac{n}{m}<2 21<mn<2)
若 n m > 1 2 , 保 证 有 正 整 数 解 若\frac{n}{m}>\frac{1}{2},保证有正整数解 mn>21,


总结:既然题目只要求一组解,那么就要大胆地作假设来方便自己的运算,大胆地凑答案

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll read(){
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int T,rev;
ll n,m,a,b,c,d,p,q;
void solve(){
	rev=0;
	p=q=1ll;
	if(n>m){
		swap(n,m);rev=1;
	}
	while(4ll*n<m){
		p*=2ll;
		n*=8ll;
	}
	if(2ll*n<=m){
		p*=3ll;
		n*=27ll;
		q*=2ll;
		m*=8ll;
	}
	a=q*(n+m);b=q*(2ll*n-m);
	c=p*(n+m);d=p*(2ll*m-n);
	if(rev) printf("%lld %lld %lld %lld\n",c,d,a,b);
	else printf("%lld %lld %lld %lld\n",a,b,c,d);
}
int main(){
	scanf("%d",&T);
	while(T--){
		n=read();m=read();
		solve();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值