• 题解: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;
    }
    

    完结散花(求赞!)

  • 相关阅读:
    java反射——字段
    java反射——方法
    java反射——构造方法
    代构建高可用分布式系统的利器——Netty
    JavaEE复习计划
    Java基础复习计划(三)
    Java基础复习计划(二)
    Java基础复习计划
    关于内网穿透的相关内容
    Docker化你的应用
  • 原文地址:https://www.cnblogs.com/tlx-blog/p/12306919.html
Copyright © 2020-2023  润新知