1. 程式人生 > >P3909 異或之積

P3909 異或之積

include 什麽 pre show 第一個 實現 所有 scanf clu

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 異或之積