题解:P11701 [ROIR 2025] 平方差

题解:P11701 [ROIR 2025] 平方差

题目传送门

赛时被创飞了,所以应当好好想一下这样的题该怎么做。

题目思路

朴素算法

按题意模拟即可。但是显然会炸。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll l,r,d,cnt=0;
int main(){
	cin>>d>>l>>r;
	for(int i=l;i<=sqrt(r);i++){
		for(int j=i;j<=sqrt(r);j++){
			if((j+i)*(j-i)==d) cnt++;
		}
	}	
	cout<<cnt;
	return 0;
}

时间复杂度 O(n2)

优化

平方差公式:(a+b)(ab)=a2b2

由题可得 x2y2=d 可以变成 (xy)(x+y)=d
a=xyb=x+y=da,则一定满足 a<bab=d。所以枚举 a 即可。枚举范围 [1,d)
又可得 x=a+b2y=ba2,判断是否满足 ly2<x2r 即可。
注意为了使 xy 为整数,ab 的奇偶性必须相同。
时间复杂度 O(d)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll d,l,r,cnt;
int main() {
    cin>>d>>l>>r;
    for (ll a=1;a<sqrt(d);a++) {
        if(d%a!=0) continue;
        ll b=d/a;
        if((a%2)!=(b%2)) continue;
        ll x=(a+b)/2;
        ll y=(b-a)/2;
        if(y*y>=l&&x*x<=r&&y*y<x*x) cnt++;
    }
    cout<<cnt;
    return 0;
}
posted @   M1_Byte  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示