【CometOJ#0A】解方程(数学水题)

博客围绕方程\(\sqrt{x - \sqrt{n}} + \sqrt{y} - \sqrt{z} = 0\),求解自然数解\(x,y,z\)的数量及所有解\(xyz\)之和。先推式子,当\(n\)为完全平方数有无数解;\(n\)非\(4\)倍数无解;否则枚举\(y\)求解。最后给出代码链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点此看题面

大致题意: 给定自然数\(n\),让你求出方程\(\sqrt{x-\sqrt n}+\sqrt y-\sqrt z=0\)的自然数解\(x,y,z\)的数量以及所有解\(xyz\)之和。

推式子

这道题应该不是很难。

移项可以得到:

\[\sqrt{x-\sqrt n}=\sqrt z-\sqrt y\]

两边同时平方:

\[x-\sqrt n=y+z-2\sqrt {yz}\]

则我们可以得出第一个结论:

\(n\)为完全平方数,即\(\sqrt n\)为整数时,有无数组解,直接输出\(infty\)

否则,我们可知:

\[\begin{cases}x=y+z,&①\\\sqrt n=2\sqrt{yz}&②\end{cases}\]

其中,对于\(②\)式,我们再同时平方得到:

\[n=4yz\]

有了这个式子,加上前面\(①\)式中得出的\(x=y+z\),我们就可以轻松得出结论:

\(n\)不为\(4\)的倍数,则无解,直接输出"0 0"。

否则的话,我们就\(O(\frac{\sqrt n}2)\)枚举\(y\)(由原式易知\(y<z\)),然后就可以求出答案了。

具体实现详见代码。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define X 1000000007
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n;
int main()
{
    RI Ttot,i,ans1,ans2;scanf("%d",&Ttot);W(Ttot--)
    {
        if(scanf("%d",&n),(int)sqrt(n)*(int)sqrt(n)==n) {puts("infty");continue;}//若n为完全平方数,有无数组解
        if(n%4) {puts("0 0");continue;}//若n不为4的倍数,无解
        for(n/=4,ans1=ans2=0,i=1;1LL*i*i<=n;++i) !(n%i)&&(++ans1,Inc(ans2,1LL*n*(i+n/i)%X));//枚举y,统计答案
        printf("%d %d\n",ans1,ans2);//输出
    }return 0;
}

转载于:https://www.cnblogs.com/chenxiaoran666/p/CometOJ0A.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值