专栏文章

题解:P12883 [蓝桥杯 2025 国 C] 正方形构造

P12883题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioxklm9
此快照首次捕获于
2025/12/03 02:47
3 个月前
此快照最后确认于
2025/12/03 02:47
3 个月前
查看原文
题目大意:
给你一个由 nn 个正整数组成的序列 aa ,求符合条件的四元组( ii , jj , pp, qq )满足 ii , jj , pp , qq 互不相同且( 00 , 00 )、( ai-a _ {i} , aja _ {j} )、( apa _ {p} , aqa _ {q} )、( apaia _ {p}-a _ {i} , aj+aqa _ {j}+a _ {q} )能构成一个正方形的数量,答案对 1e9+71e9+7 取模。(1<= nn <= 1e61e6 ,1<= aia _ {i} <=1000)
解题思路:
我们首先要先翻译一下题目所给的已知条件。首先令( 00 , 00 )为A点,( ai-a _ {i} ,aja _ {j} )为B点,( apa _ {p} ,aqa _ {q} )为C点,( apaia _ {p}-a _ {i} , aj+aqa _ {j}+a _ {q} )为D点。因为( ai-a _ {i} ) 0-0 =( apaia _ {p}-a _ {i} ) ap-a _ {p} 并且 aj0a _ {j}-0 =( aj+aqa _ {j}+a _ {q} ) aq-a _ {q} ,所以BA平行且等于DC,四边形ABCD为平行四边形。若要使四边形ABCD为正方形,则 aia _ {i} = aqa _ {q}aja _ {j} = apa _ {p} ,这个结论可以用全等或用直线BA的斜率*直线CA的斜率为 1-1 得出。接下来,最朴素的想法是枚举 ii , jj , pp , qq ,再一一检验是否满足条件,但这是 O(n4)O(n^4) 的,无法通过此题。我们可以转变一个思路,由于 aia _ {i} 的上限远远小于 nn 的上限,并且我们并不需要去关心究竟是哪些四元组对答案造成了贡献,所以我们可以记录每个数值在 aa 序列的数量为 mpimp _ {i} ,再枚举 aia _ {i}aja _ {j} 的数值,用题目中样例说明所提示的方法进行一个组合数的计算,如果 aia _ {i} != aja _ {j}ans+=Ampi2Ampj2ans+=A_{mp _ {i}}^{2}*A_{mp _ {j}}^{2} ,否则ans+=Ampi4ans+=A_{mp _ {i}}^{4} 即可获得最终答案,这是 O(n)O(n) 的。
代码实现:
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,M = 1e3+10;
const int md = 1e9+7;
#define int long long
int n,a[N],mp[M],cnt[N],ans;
signed main(){
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        mp[a[i]]++;
    }
    for(int i=1;i<=1000;i++){
        for(int j=1;j<=1000;j++){
            if(i==j) cnt[i*j]=(cnt[i*j]%md+mp[i]%md*(mp[i]-1)%md*(mp[i]-2)%md*(mp[i]-3)%md)%md;
            else cnt[i*j]=(cnt[i*j]%md+mp[i]%md*(mp[i]-1)%md*mp[j]%md*(mp[j]-1)%md)%md;
        }
    }
    for(int i=1;i<=N-10;i++){
        ans=(ans%md+cnt[i]%md)%md;
    }
    cout<<ans<<endl;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...