我真的是太太太太蒟蒻了QwQ

2020/8/25晚

Lcy大佬让我们进了QHOI洛谷群,然后就让我们AK掉他一年前搞的比赛
然后别人就一个又一个AC了T1(lcy说这是**题)QAQ结果我A不掉.....
不过确实不是很难,没有考到算法,完全是数学Problem(太菜了,数学都不会了QWQ

题目

先亮 简单
image
先不管前面的可爱的珂朵莉了,先把题给A了,题目可以理解为:
对于正整数a,b,要找到满足(ka)(kb)都是完全平方数的所有k,并从大到小输出

思路

-首先肯定会想到暴力枚举并处理,结果是爆零!大佬数据太牛了(或者是我太弱啦,lcy说这题他小学觉得有点难,orz

然后通过长时间的找规律加以思考,有了如下思路:

sqrt(ka)=psqrt(kb)=q

则有

p2+a=q2+b=k

p2q2=abs(ba)(a>b)

整理可得

(p+q)(pq)=ab

此时的话,k应该是p2+a或者是与之相同的q2+b

可是然后呢???本蒟蒻当时只能想到这了,不会求了,还是26号让大佬和我讲讲吧(希望能听懂—_—)

正解

(次日,lcy跟我解释完了,前面的思路是没错,然后就是该想以下内容了。
首先已知a,b都是正整数,那么它们的差值的绝对值自然也是非负整数,那么可以将这个差值进行优化的找因子,只要到logn即可(具体看代码。

每找到一个因子m,就可以使n=(ab)/m,从而nm=ab=(p+q)(pq)

由于只需找到sqrt(n),自然所找到的因子m都会小于n,比如对于数字8,只会找到2,不可能到4。这个也很好想,不赘述了QAQ

那么对于式子(pq)(p+q)而言,显而易见,pq<p+q(p,qN),所以可以有m=pq,n=p+q

解得 p=(m+n)/2,q=np

但是这里又有一些小问题,如果解出来的p是小数,那么这组解是不是正解呢???

肯定不是啦!回翻到题目,你会看到这一句话:

(ka)(kb)都是完全平方数

再翻到思路,你又会看到这一句话:

sqrt(ka)=psqrt(kb)=q

这不就说明了p,q都是正整数了吗?

贴代码

void solve(ll x,ll y){
ll p,q;
if(x>y)swap(x,y);
ll cha=abs(x-y);
for(register int i=1;i*i<=cha;++i){
if(cha%i==0&&(i+cha/i)%2==0){
//p-q=i;p+q=cha/i;
p=(i+cha/i)/2;//大的
q=p-i;//小的
cout<<p*p+x<<endl;
}
}
}

完整代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a,b;
void solve(ll x,ll y){
ll p,q;
if(x>y)swap(x,y);
ll cha=abs(x-y);
for(register int i=1;i*i<=cha;++i){
if(cha%i==0&&(i+cha/i)%2==0){
//p-q=i;p+q=cha/i;
p=(i+cha/i)/2;//大的
q=p-i;//小的
cout<<p*p+x<<endl;
}
}
}
int main(){
cin>>a>>b;
solve(a,b);
return 0;
}
/*
今天你AC了几题?
不要颓废!!!!
Dalao has AKed IOI several times!!!
*/

结果

image
芜湖,完美结束这道题了!QwQ

posted @   LsmQwQ  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示