题解:luogu P3909

这个题拖了快三个月了,只因缺个龟速乘(气愤.jpg)。
题目链接:P3909 异或之积
你确定没人用前缀和,后缀和吗?
蒟蒻想法与众不同!
我们实验\(A[]={1,2,3,4}\)
这里计不乘6时答案为\(sum\).
\[sum=1×2×3+1×2×4+1×3×4+2×3×4\]
\[=(1+2)×3×4+1×2×(3+4)\]
你可以试试\(n\)更大的,比如6(懒得打了)。
我们记\(pre_i\)为的\(i\)个数的前缀和,\(suf_i\)是后缀和,则:
\[sum=\sum_{i=1}^{n-2}pre_i×(i+1)×suf_{i+2}\]
最后乘上6就好了。
可以预处理,而我在计算中直接处理,降低了空间消耗。
但迷惑的是不上龟速乘只有\(10pts\),不知为什么,我都取了那么多模了
下面上代码:

#include<iostream>
#include<cstdio>
using namespace std;
long long n,a[3000005];
long long x=0,y,z;
long long ans=0;
const int mod=1e9+7;
inline long long mul(long long x,long long y,long long mod)
{
    long long tmp=(x*y-(long long)((long double)x/mod*y+1.0e-8)*mod);
    return tmp<0 ? tmp+mod : tmp;
}//龟速乘
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    z=a[n];
    y=a[n-1];//我这里把x作为前缀和,z是后缀和,动态更新,y没多少卵用
    for(int i=1;i<=n-2;i++) x=x+a[i]%mod;
    for(int i=1;i<=n-2;i++)
    {
        ans=(ans+(mul(mul(x,y,mod),z,mod)))%mod;
        x=(mod+x-a[n-i-1])%mod;
        y=a[n-i-1]%mod;
        z=(z+a[n-i])%mod;
    }//计算就好了,没多少高深的东西
    printf("%lld",(6*ans%mod)%mod);//记得乘6
    return 0;
}

完结散花(求赞!)

猜你喜欢

转载自www.cnblogs.com/tlx-blog/p/12306919.html