ZOJ 3759 几个二元二次不定方程的解法

这里是题目地址

 

题意是给定k(k=3,5,6),a,问是否存在一个四边形数,使得它的a倍是一个k边形数。如果存在,求出最小解

k边形数的定义

那么题目意思实际是求解关于x,y的不定方程

代入具体的k并变形可以得到

可以看出这几个方程具有相同的形式,我们考虑更一般的情况

配方可以得到

换元可以得到关于z,y的不定方程

显然这是一个佩尔方程,当4ab为完全平方数无解,否则有无数组正整数解

 

其中为方程的最小解。显然有

那么问题可以转化为找到一个最小的n,使得

这个一般化问题我也不知道怎么做。。只会暴力

不过本题中a只取到1,2,3,这个时候n若存在,必为1,因此只要测试z1是否符合答案即可。(可以枚举z1%2a得到这个结论)

 1 bint h[2] ,k[2] ;
 2 void Solve( int n ){
 3     ll c ,q ,a ,step = 0 ,sqrtn = sqrt(n+.0) ;
 4     c = sqrtn ,q = n - c * c ,a = ( sqrtn + c ) / q ;
 5     ll bc = c ,bq = q  ;
 6     h[0] = 1 ,h[1] = sqrtn ;
 7     k[0] = 0 ,k[1] = 1 ;
 8     while( 1 ){
 9         h[step] = a * h[step^1] + h[step] ;
10         k[step] = a * k[step^1] + k[step] ;
11         c = a * q - c ;
12         q = ( n - c * c ) / q ;
13         a = ( sqrtn + c ) / q ;
14         if( c == bc && q == bq && step ) return  ;
15         step ^= 1 ;
16     }
17 }
解pell方程

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/MyWither/p/3580551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值