0
点赞
收藏
分享

微信扫一扫

2022namo div1 平方计数 (数论)

Gascognya 2022-03-21 阅读 22
C++算法

题目

http://oj.daimayuan.top/course/10/problem/607
在这里插入图片描述

分析

a^2+b=c^2
b	=(c+a)(c-a)
 	=(x+2a)(x)

对每个数b,枚举约束 x,检查是否存在对应的a即可。

在这里插入图片描述
一百万以内的数,最大约数个数是240。

代码

// http://oj.daimayuan.top/course/10/problem/607
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;

int n;
int a[MAXN];
int cnt[MAXN];
int used[MAXN];




void solve()
{
    long long ans=0;
    scanf("%d",&n);
    for (int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
        cnt[a[i]]++;
    }
    for (int i=1; i<=n; i++) if (!used[a[i]]) {
        used[a[i]]=1;

        int B=a[i];
        int k=1, t=a[i], x1, x2;
        while (k<t) {   // 枚举约数
            if (t%k==0) {
                x1=k;
                x2=B/k;
                if ((x2-x1)%2==0) ans += cnt[(x2-x1)/2];
            }
            k=t/(t/(k+1));
        }
        if (k==t) ans+= cnt[0];
    }

    printf("%lld\n",ans);
}


int main()
{
    solve();
    return 0;
}




/*
        int k=1, t=a[i], x1, x2;
        while (k<t) {
            if (t%k==0) {
                x1=k;
                x2=B/k;
                if (x2<x1) break;
                if ((x2-x1)&1) continue;
                ans += cnt[(x2-x1)/2];
            }
            k=t/(t/(k+1));
        }


    for (int i=1; i<=n; i++) if (!used[a[i]]) {
        used[a[i]]=1;

        int B=a[i];
        int L=1, R=B, x1, x2;
        while (L<R) {
            if (B%L == 0) {
                x1=L;
                x2=B/L;
                if (x2<x1) break;
                if ((x2-x1)%2==0) ans += cnt[(x2-x1)/2];
            }
            R=B/(L+1);
            L=B/R;
        }
        if (L==R && n%L==0) ans+=cnt[0];
    }
*/
举报

相关推荐

0 条评论