欢迎这位怪蜀黍来到《题解:luogu P3909 - 童话镇里的星河 - 博客园》

题解:luogu P3909

这个题拖了快三个月了,只因缺个快速乘(气愤.jpg)。
题目链接:P3909 异或之积
你确定没人用前缀和,后缀和吗?
蒟蒻想法与众不同!
我们实验A[]=1,2,3,4A[]=1,2,3,4
这里计不乘6时答案为sumsum.

sum=1×2×3+1×2×4+1×3×4+2×3×4sum=1×2×3+1×2×4+1×3×4+2×3×4

=(1+2)×3×4+1×2×(3+4)=(1+2)×3×4+1×2×(3+4)

你可以试试nn更大的,比如6(懒得打了)。
我们记preiprei为的ii个数的前缀和,sufisufi是后缀和,则:

sum=n2i=1prei×(i+1)×sufi+2sum=n2i=1prei×(i+1)×sufi+2

最后乘上6就好了。
可以预处理,而我在计算中直接处理,降低了空间消耗。
但迷惑的是不上快速乘只有10pts10pts,不知为什么,我都取了那么多模了
下面上代码:

#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;
}

完结散花(求赞!)

posted @   童话镇里的星河  阅读(136)  评论(0编辑  收藏  举报
编辑推荐:
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
点击右上角即可分享
微信分享提示