【代码源每日一题Div1】平方计数「nlogn巧妙枚举倍数优化」
创始人
2024-02-10 05:13:49
0

平方计数

题目描述:

给你n个数字,求存在多少对(i, j),满足 ai2+aja_i^2+a_jai2​+aj​是一个完全平方数

思路:

假设 ai2+aj=x2a_i^2+a_j=x^2ai2​+aj​=x2

则 aj=(x+ai)∗(x−aj)a_j=(x+a_i)*(x-a_j)aj​=(x+ai​)∗(x−aj​)

即存在aj的因子p,qp*q=a[j]p-q = 2*a[i]

显然一个简单的思路是去枚举a[j]的所有因数,看存在多少个满足条件的,但是复杂度是 O(nn)O(n\sqrt{n})O(nn​),会超时

我们需要考虑进行一下优化

可以发现,其实就是利用了两个因数,而且这两个因数的乘积不超过1e6

所以我们可以通过枚举每个数字i的倍数的方法去优化,即

for(int i = 1; i <= 1000000; ++i){for(int j = i; j <= 1000000; j += i){//j是其中的一个因数,j/i是另一个因数int mi = min(i, j/i), ma = max(i, j/i);int d = ma - mi;if(d%2==0){ans += tr[j]*tr[d/2];}}}

最后输出ans/2就行

#include
using namespace std;
#define int long long
#define endl '\n'
#define io ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define m_p(a, b) make_pair(a, b)typedef long long ll;
typedef pair pii;#define MAX 1000050int n, m, x;
int tr[MAX];void work(){cin >> n;ll ans = 0;for(int i = 1; i <= n; ++i){cin >> x;++tr[x];	}for(int i = 1; i <= 1000000; ++i){for(int j = i; j <= 1000000; j += i){int mi = min(i, j/i), ma = max(i, j/i);int d = ma - mi;if(d%2==0){ans += tr[j]*tr[d/2];}}}cout << ans/2 << endl;
}signed main(){io;work();return 0;
}

相关内容

热门资讯

阿廖沙与外祖母相依为命的生活 阿廖沙与外祖母相依为命的生活螨虫,写作业要靠自己!我也开始挣钱了。 ! 3 R Q y逢节假日就走街...
我不知道应该怎么和你相处,我有... 我不知道应该怎么和你相处,我有的时候可能真的太自我了,愿你不怪,愿我可改。我该怎么回复我俩因为小问题...
中源家居股份有限公司2024年... ■中源家居股份有限公司2024年限制性股票激励计划预留授予结果公告本公司董事会及全体董事保证本公告内...
上海阿拉丁生化科技股份有限公司... 证券代码:688179 证券简称:阿拉丁 公告编号:2025-050转债代码:118006 转债简称...
北京福元医药股份有限公司关于盐... 证券代码:601089 证券简称:福元医药 公告编号:临2025-049北京福元医药股份有限公司关...
请教如何从零基础学习工程造价 请教如何从零基础学习工程造价本来不是学这个专业的,但是家里有从事建筑施工的,没有基础,别人讲的听起来...
中国交通建设股份有限公司关于召... 证券代码:601800 证券简称:中国交建 公告编号:2025-040中国交通建设股份有限公司关于...
宁波天益医疗器械股份有限公司关... 证券代码:301097 证券简称:天益医疗 公告编号:2025-038宁波天益医疗器械股份有限公司...
黄山的民宿、凉山的老菜馆拿到了... 着眼于提升消费供给效能,金融机构正加大对消费基础设施的信贷支持力度,安排匹配项目体量的资金驰援。工商...
谁有好看的动漫 谁有好看的动漫妖狐x仆ss火影忍者【不过挺长的, 你可以先看8个剧场版。】会长是女仆吸血鬼骑士这几个...