P3909 异或之积

Posted lance1ot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3909 异或之积相关的知识,希望对你有一定的参考价值。

P3909 异或之积

为什么叫做异或之积?
答曰:只要不关乎Alice和Bob就行


做完这道水题,感觉自己弱爆了。
一开始就要考虑暴力(O(n^3))的优化。
然后就注意到了题目中的(6)为什么不是⑨
然后就想到了全排列,然后根据全排列瞎搞了一波。
如下:

注意到(A_i*A_j*A_k=A_j*A_k*A_i),然后三个元素的全排列个数就是6
然后题意转变为从一堆数中,不重复,不遗漏的选出三个元素,求出所有三元组的积的和
怎么实现呢?
一开始就是(O(N^3))的暴力
然后发现可以利用前缀和的思想,将后两个数的乘积算出来,在前缀和一下。然后在(O(N))的枚举第一个数,利用前缀和计算出和
然后又可以使用类似的思想,将那个(O(N^2))的预处理也变成(O(N))的。

但是

我调了好久,还是没有gan出来。
然后看了看其他人的code。发现
我们只要处理出三个前缀和就行了。

代码如下

#include<cstdio>
#include<algorithm>
#include<iostream>
const int maxn=1000010;
const long long mod=1e9+7;
int s[maxn];
int S[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    long long pas;
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&pas);
        s[i]=(s[i-1]+pas)%mod;
        S[i]=(S[i-1]+pas*s[i-1])%mod;
        ans=(ans+pas*S[i-1])%mod;
    }
    pas=ans;
    for(int i=1;i<=5;i++)
        ans=(ans+pas)%mod;
    printf("%lld",ans);
}

真的是纯真不做作。吐血emmm

发现自己口胡了一波看似正解的东西,被一波code技巧打败了。
sad

以上是关于P3909 异或之积的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3689: 异或之

BZOJ3689异或之 堆+可持久化Trie树

[省选]省选知识点进度

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

华为OD机试真题Java实现素数之积真题+解题思路+代码(2022&2023)

最短路(最短路之积)