Anarchy的解题报告
题目大意:
假设高斯定理在 m m维空间成立
已知mm维空间所有整点电荷 aj a_j
给出 m m维空间下x,yx,y两点距离公式
以及x点在y点引发的电势公式
降序输出求前100个点的电势
T≤51≤m≤18n≤3∗105 T≤5 1≤m≤18 n≤3*10^5
时限 7s 7s
考试的时候看这道题的时候 感觉这道题根本不可做啊???
部分分很友好啊?除了一个5分的点 其他我都不会。。
看完题解之后整个人都不好了。。
然后我用了一个下午来调试 压常
其实 上面那个式子就是卷积的形式 只不过 这个是m维卷积。。。(做毛线啊
好吧 m维卷积大家都会喜闻乐见的 FWT ?
平常的FWT一般都是每一维大小为2 的情况 当大于2的时候我们可以直接上DFT
然后我们会发现这个循环卷积也不好处理
怎么办呢?
将DFT的式子拆成卷积形式 然后FFT优化卷积之后即可得出
即 Bluestein′sAlgorithm Bluestein’s Algorithm
时间复杂度 O(nlog2n) O(nlog^2n)
注意常数很大 所以不得不不预处理单位根 以及一些黑科技
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
#define ld double
ld Sin[20],Cos[20];
struct com
{ld a,b;com(){}com(ld a,ld b):a(a),b(b){}friend com operator +(com a,com b){return com(a.a+b.a,a.b+b.b);}friend com operator -(com a,com b){return com(a.a-b.a,a.b-b.b);}friend com operator *(com a,com b){return com(a.a*b.a-a.b*b.b,a.b*b.a+a.a*b.b);}friend com operator /(com a,ld b){return com(a.a/b,a.b/b);}friend com operator *(com a,ld b){return com(a.a*b,a.b*b);}};
constld pi=acos(-1);
int rev[2200005];
void FFT(com *a,int n,int fl)
{int Len=1<<n;for(int i=0;i<Len;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<n-1);for(int i=0;i<Len;i++)if(rev[i]>i)swap(a[rev[i]],a[i]);for(int p=0,i=1;i<Len;i*=2,p++){com w=com(Cos[p],fl*Sin[p]);for(int j=0;j<Len;j+=2*i){com w0=com(1,0);for(int k=0;k<i;k++){com x=a[j+k],y=w0*a[i+j+k];a[j+k]=x+y;a[j+k+i]=x-y;w0=w0*w;}}}if(fl==-1)for(int i=0;i<Len;i++)a[i]=a[i]/Len;
}com c[2200005],b[2200005];
int C;
ld SIN[2200005],COS[2200005];
void DFT(com* a,int d,int n,int fl)
{int N=1;for(;(1<<N)<(3*n);N++);int P=C/2/n,Nf=2*n;for(int i=0;i<2*n;i++)b[i]=com(COS[i*1ll*i%Nf*P],fl*SIN[i*1ll*i%Nf*P]); for(int i=0;i<n;i++)c[n-i]=com(COS[i*1ll*i%Nf*P],-fl*SIN[i*1ll*i%Nf*P])*a[i*d];if(n<=50){for(int i=n;i<2*n;i++){int pos=i-n;pos*=d;a[pos]=com(0,0);for(int j=0;j<=i;j++)a[pos]=a[pos]+b[i-j]*c[j];}}else{for(int i=0;i<N;i++)Cos[i]=cos(pi/(1<<i)),Sin[i]=sin(pi/(1<<i));FFT(b,N,1);FFT(c,N,1);for(int i=0;i<(1<<N);i++)b[i]=b[i]*c[i];FFT(b,N,-1);for(int i=0;i<n;i++)a[i*d]=b[i+n];}for(int i=0;i<n;i++)a[i*d]=a[i*d]*com(COS[i*1ll*i%Nf*P],-fl*SIN[i*1ll*i%Nf*P]);if(fl==-1)for(int i=0;i<n;i++)a[i*d]=a[i*d]/n;for(int i=0;i<(1<<N);i++)b[i]=c[i]=com(0,0);
}
int s[2200005];
void FWT(com* a,int n,int m,int fl)
{int len=1;for(int i=0;i<m;len*=s[i++])for(int j=0;j<n;j+=len*s[i])for(int k=0;k<len;k++)DFT(a+j+k,len,s[i],fl);
}
com Da[2200005];
int no[2200005];
bool cmp(int a,int b)
{return Da[a].a>Da[b].a;
}
int main()
{freopen("anarchy.in","r",stdin);freopen("anarchy.out","w",stdout);int T;scanf("%d",&T);while(T--){int m,n=1;scanf("%d",&m);for(int i=0;i<m;i++)scanf("%d",s+i),n*=s[i];C=n;for(int i=0;i<n;i++){int t;scanf("%d",&t);Da[i].a=t;Da[i].b=1;for(int t=i,j=0;j<m;t/=s[j++])Da[i].b*=t%s[j]+1;Da[i].b=powl(Da[i].b,2.0/m); Da[i].b/=2.*m;Da[i]=com(Da[i].a+Da[i].b,Da[i].a-Da[i].b); }C*=2;for(int i=0;i<2*n;i++)SIN[i]=sin(2*pi/2/n*i),COS[i]=cos(2*i*pi/2/n);FWT(Da,n,m,1);for(int i=0;i<n;i++)Da[i]=Da[i]*Da[i];FWT(Da,n,m,-1);for(int i=0;i<n;i++)no[i]=i;sort(no,no+n,cmp);for(int i=0;i<min(n,100);i++)printf("%.9f ",Da[no[i]].a/4);puts("");}return 0;
}
Anarchy的解题报告相关推荐
- uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)
线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报 分类: ...
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...
- 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 解题报告(十三)中国剩余定理(ACM / OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 解题报告(四)生成函数(ACM/ OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
最新文章
- Nature Biotechnology封面 | 经济快速:纳米孔宏基因组方案, 6小时准确识别下呼吸道病原体...
- linux关机 hibernate,Linux关机命令
- 前端面试——初(H)入(T)江(M)湖(L)
- oracle引用vs,VS2013中使用oracle,有关引用哪个.dll
- 修改小程序swiper 点的样式_高质量的微信小程序样式模板应该长什么样?
- 《英雄联盟:双城之战》全球首映 沉浸式观影打造追剧新潮流
- POJ 1821 Fence(单调队列优化DP)
- 封装Python列表实现多下标访问
- Exchange 2010升级补丁时的服务状态变化
- 一文快速了解 Java 9 - 16 新特性,网友:卷不动了?
- 详解SpringBoot整合ace-cache缓存
- 一步一步学会JDBC
- TLSF算法1:二级索引的计算
- QT移植腾讯云C-SDK结合实现OTA更新
- python MDI窗口加载ui文件方法
- phpmywind 调取导航
- 如何系统自学软件测试,看这篇软件测试学习方法万字总结就够了
- 超好玩的模拟游戏:美国卡车模拟Mac中文版
- linux bios设置界面,BIOS怎么设置 史上最详细的bios设置图解教程
- Alex Woodie:2019大数据预测